天天看點

join left on多張表_left join 聯接多張一對多子表時出現重複資料,求大神給個解決方案...

left join 連接配接多張一對多子表時出現重複資料,求大神給個解決方案

現在有 A,B,C,D四張表,A為主表,B、C、D都是子表,與A屬于一對多關系。查詢後出現大量重複資料

表A

-----------------------------------------------

cID                      Name

1                          張三

2                          李四

表B

-----------------------------------------------

cID                      Car

1                          本田飛度

1                          POLO

表C

-----------------------------------------------

cID                      Credit

1                          廣發信用卡

1                          興業信用卡

1                          民生信用卡

表D

-----------------------------------------------

cID                      Hose

1                          怡海花園14号樓201

1                          富錦家園7号樓702

查詢語句

SELECT * FROM A LEFT JOIN B ON (A.cID = B.cID)  LEFT JOIN C ON (A.cID = C.cID)  LEFT JOIN D ON (A.cID = D.cID)

查詢結果為

cID                  Name                   Car                      Credit                      Hose

1                      張三                      本田飛度             廣發信用卡             怡海花園14号樓201

1                      張三                      本田飛度             廣發信用卡             富錦家園7号樓702

1                      張三                      本田飛度             興業信用卡             怡海花園14号樓201

1                      張三                      本田飛度             興業信用卡             富錦家園7号樓702

1                      張三                      本田飛度             民生信用卡             怡海花園14号樓201

1                      張三                      本田飛度             民生信用卡             富錦家園7号樓702

1                      張三                       POLO                 廣發信用卡             怡海花園14号樓201

1                      張三                       POLO                 廣發信用卡             富錦家園7号樓702

1                      張三                       POLO                 興業信用卡             怡海花園14号樓201

1                      張三                       POLO                 興業信用卡             富錦家園7号樓702

1                      張三                       POLO                 民生信用卡             怡海花園14号樓201

1                      張三                       POLO                 民生信用卡             富錦家園7号樓702

我最終想實作的效果為:

cID                  Name                   Car                      Credit                      Hose

1                      張三                      本田飛度             廣發信用卡             怡海花園14号樓201

POLO                  興業信用卡             富錦家園7号樓702

民生信用卡

------解決思路----------------------

---1樓的 将LEFT JOIN 修改成INNER JOIN 就正确了

;WITH BCte AS(

SELECT ROW_NUMBER()OVER(ORDER BY GETDATE())RN,* FROM B

)

,CCte AS(

SELECT ROW_NUMBER()OVER(ORDER BY GETDATE())RN,* FROM C

)

,DCte AS(

SELECT ROW_NUMBER()OVER(ORDER BY GETDATE())RN,* FROM D

)

SELECT A.*,T1.Car,T2.Credit,T3.Hose FROM A

INNER JOIN BCte T1 ON A.cID=T1.cID

FULL JOIN CCte T2 ON A.cID=T2.cID AND T1.RN=T2.RN

FULL JOIN DCte T3 ON A.cID=T3.cID AND T1.RN=T3.RN

------解決思路----------------------

同cID的記錄數小于2048有效;WITH ACte AS(

SELECT TB2.number RN,TB1.* FROM A TB1,master..spt_values TB2 WHERE TB2.type='P'

)

,BCte AS(

SELECT ROW_NUMBER()OVER(PARTITION BY cID ORDER BY GETDATE())RN,* FROM B

)

,CCte AS(

SELECT ROW_NUMBER()OVER(PARTITION BY cID ORDER BY GETDATE())RN,* FROM C

)

,DCte AS(

SELECT ROW_NUMBER()OVER(PARTITION BY cID ORDER BY GETDATE())RN,* FROM D

)

SELECT T.cID,T.NAME,T1.Car,T2.Credit,T3.Hose FROM ACte T

LEFT JOIN BCte T1 ON T.cID=T1.cID AND T.RN=T1.RN

FULL JOIN CCte T2 ON T.cID=T2.cID AND T.RN=T2.RN

FULL JOIN DCte T3 ON T.cID=T3.cID AND T.RN=T3.RN

WHERE (T1.cID IS NOT NULL OR T2.cID IS NOT NULL OR T3.cID IS NOT NULL)

ORDER BY T.cID,T.RN