2017-09-15 11 views
1

テーブルに重複する行を示すクエリがあります。今、別のテーブルのデータフィールドをクエリに追加する方法について説明します。SQL Server:サブクエリの別のテーブルのデータフィールドを追加

SELECT 
    T1.lname, T1.fname, T1.rtg_id 
FROM 
    (SELECT 
     lname, fname, rtg_id 
    FROM 
     cpmd b 
    GROUP BY 
     lname, fname, rtg_id 
    HAVING 
     COUNT(*) >= 2) T1 
JOIN 
    cpmd T2 ON T1.lname = T2.lname 
      AND T1.fname = T2.fname 
      AND T1.rtg_id= T2.rtg_id 
ORDER BY 
    lname, fname 

これは、以下の結果になり:私は一人一人の電話番号、ファックス番号を取得する必要があります

(私はあなたのためだけにここにあった、私の実際のクエリでIDを削除しました)。いくつかのレコードは、同じ名前などが異なる電話番号とファックス番号を持つことがあります。このようなものが必要です:

md_id lname fname rtg_id Home   Fax 
------------------------------------------------------------- 
9901 Smith John 12300 (654) 5894676 (231) 7684353 
9902 Smith John 12300 (546) 4576369 NULL 
9903 Lee  Bob  45600 (654) 9844576 (234) 2835657 
9904 Lee  Bob  45600 (778) 6780853 NULL 

これらは、電話の種類と電話番号を含む2つのテーブルです。

cpmd_phoneテーブル:

md_id phone_id phone_type 
------------------------------ 
9901 90   FAX 
9901 91   HOME 
9902 92   FAX 
9902 93   HOME 
9903 94   FAX 
9903 95   HOME 
9904 96   FAX 
9904 97   HOME 

csphoneテーブル

phone_id area_code phone_no 
--------------------------------- 
90   231   7684353 
91   654   5894676 
92   null  null  
93   546   4576369 
94   234   2835657 
95   654   9844576 
96   null  null 
97   778   6780853 

は、これは私がこれまで持っているものですが、それは正しく動作しません。時にはそれが

SELECT 
    T1.lname, T1.fname, T1.asmdid, T1.rtg_id, t1.Phone, T1.Fax 
FROM 
    (SELECT 
     lname, fname, rtg_id, 
     MIN(b.md_id) AS asmdid, 
     MIN(CASE WHEN (d.phone_type_cn = 2) 
        THEN '(' + e.area_code + ') ' + e.phone_no 
        ELSE NULL 
      END) AS Phone, 
     MIN(CASE WHEN (d.phone_type_cn = 4) 
        THEN '(' + e.area_code + ') ' + e.phone_no 
        ELSE NULL 
      END) AS Fax 
    FROM 
     cpmd b 
    JOIN 
     cpmd_phone d on b.md_id = d.md_id 
    JOIN 
     csphone e ON d.phone_id = e.phone_id 
    GROUP BY 
     lname, fname, rtg_id 
    HAVING 
     COUNT(*) >= 2) T1 
JOIN 
    cpmd T2 ON T1.lname = T2.lname 
      AND T1.fname = T2.fname 
      AND T1.rtg_id = T2.rtg_id 
      AND T1.asmdid <> T2.md_id 
ORDER BY 
    lname, fname 

答えて

1

SELECT 
    T1.lname, 
    T1.fname, 
    T1.rtg_id, 
    Home = max(case when ph.phone_type = 'HOME' then '(' + cast(cs.area_code as char(3)) + ') ' + cast(cs.phone_no as char(7)) end), 
    Fax = max(case when ph.phone_type = 'FAX' then '(' + cast(cs.area_code as char(3)) + ') ' + cast(cs.phone_no as char(7)) end) 
FROM 
    (SELECT lname, fname, rtg_id 
    FROM cpmd b 
    GROUP BY lname, fname, rtg_id 
    HAVING COUNT(*) >= 2) T1 
JOIN cpmd T2 ON 
    T1.lname = T2.lname 
    AND T1.fname = T2.fname 
    AND T1.rtg_id= T2.rtg_id 
LEFT JOIN cpmd_phone ph ON 
    PH.md_id = t2.md_id 
LEFT JOIN csphone cs ON 
    cs.phone_id = ph.phone_id 
GROUP BY 
    T1.lname, 
    T1.fname, 
    T1.rtg_id, 
ORDER BY lname, fname 
+0

が、これはそれが上の誤りを言うコンパイルされません... case文と合流するのカップルのように聞こえる...時にはそれはちょうど1つのレコードを表示し、2つの重複を示しph.phone_typeとcs.phone_np '無効な列名' –

+0

私は編集を追加しました@ shinratensei cs.phone_npはcs.phone_noになっていたので、単純なタイプです。 ph.phone_typeにエラーはないはずです。正確なエラーは何でしたか? – scsimon

+0

申し訳ありませんが、結果を確認するだけで動作しています。 –

関連する問題