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