2017-09-15 81 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 

這些是包含電話類型和電話號碼的兩個表。

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 

這是我迄今爲止,但它不能正常工作。有時,它顯示了2次重複,有時它只是顯示1個記錄..

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

聽起來像一個case語句和一對夫婦的加入...

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

這並不編譯它說錯誤的ph.phone_type和cs.phone_np'列名無效' –

+0

我添加了一個編輯@shinratensei cs.phone_np應該是cs.phone_no,這是一個簡單的類型。 ph.phone_type應該沒有錯誤。確切的錯誤是什麼? – scsimon

+0

對不起,它正在工作,只是檢查結果。 –

相關問題