SQL Server:从子查询上的另一个表添加数据字段

时间:2017-09-15 18:41:02

标签: sql 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
------------------------------
9901    Smith   John    12300   
9902    Smith   John    12300   
9903    Lee     Bob     45600
9904    Lee     Bob     45600

我需要获取每个人的电话号码和传真号码。有些记录虽然名称相同,但可能有不同的电话和传真号码。所以我需要这样的东西:

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 个答案:

答案 0 :(得分: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