2015-07-20 30 views
0
DECLARE @a TABLE (code INT, aname VARCHAR(10)) 
INSERT INTO @a(code, aname) SELECT 1,'A' 
INSERT INTO @a(code, aname) SELECT 2,'B' 
INSERT INTO @a(code, aname) SELECT 3,'C' 

DECLARE @b TABLE (code INT, bname VARCHAR(10)) 
INSERT INTO @b(code, bname) SELECT 1,'aaa' 
INSERT INTO @b(code, bname) SELECT 1,'bbb' 
INSERT INTO @b(code, bname) SELECT 2,'ccc' 
INSERT INTO @b(code, bname) SELECT 2,'ddd' 

DECLARE @c TABLE (code INT, cname VARCHAR(10)) 
INSERT INTO @c(code, cname) SELECT 1,'xxx' 
INSERT INTO @c(code, cname) SELECT 1,'yyy' 
INSERT INTO @c(code, cname) SELECT 1,'zzz' 
INSERT INTO @c(code, cname) SELECT 2,'www' 

我需要下面的輸出如何編寫產生從下面的表下面的輸出查詢

code  aname       bname  cname 
----------- ---------- ----------   ---------- 
1     A       aaa   xxx 
1     A       bbb   yyy 
1     A       NULL  zzz 
2     B       ccc   www 
2     B       ddd   NULL 
3     C       NULL  NULL 

我嘗試此查詢,但它不工作

SELECT * FROM @a as a 
LEFT JOIN @b b On b.code = a.code 
LEFT JOIN @C c on c.Code = A.Code 

回答

1

您可以使用ROW_NUMBER()PARTITION匹配的記錄和使用兩個單獨的LEFT JOINS,然後做這樣的FULL OUTER JOIN

SQL Fiddle

示例數據

DECLARE @a TABLE (code INT, aname VARCHAR(10)) 
INSERT INTO @a(code, aname) SELECT 1,'A' 
INSERT INTO @a(code, aname) SELECT 2,'B' 
INSERT INTO @a(code, aname) SELECT 3,'C' 

DECLARE @b TABLE (code INT, bname VARCHAR(10)) 
INSERT INTO @b(code, bname) SELECT 1,'aaa' 
INSERT INTO @b(code, bname) SELECT 1,'bbb' 
INSERT INTO @b(code, bname) SELECT 2,'ccc' 
INSERT INTO @b(code, bname) SELECT 2,'ddd' 

DECLARE @c TABLE (code INT, cname VARCHAR(10)) 
INSERT INTO @c(code, cname) SELECT 1,'xxx' 
INSERT INTO @c(code, cname) SELECT 1,'yyy' 
INSERT INTO @c(code, cname) SELECT 1,'zzz' 
INSERT INTO @c(code, cname) SELECT 2,'www' 

查詢

;WITH b1 AS 
(
SELECT *,ROW_NUMBER()OVER(PARTITION BY Code ORDER BY bname ASC) rn FROM @b 
), c1 as 
(
SELECT *,ROW_NUMBER()OVER(PARTITION BY Code ORDER BY cname ASC) rn FROM @c 
) 
SELECT ISNULL(b.code,c.code) code, ISNULL(b.aname,c.aname) aname,bname,cname FROM 
(
    SELECT a.code,aname ,b.bname,rn 
    FROM @a as a 
    LEFT JOIN b1 b ON b.code = a.code 
) b 
FULL OUTER JOIN 
(
    SELECT a.code,aname ,c.cname,rn 
    FROM @a as a 
    LEFT JOIN c1 c on c.Code = A.Code 
) c 
ON b.code = c.code 
    AND ISNULL(b.rn,0) = ISNULL(c.rn,0) 
ORDER BY ISNULL(b.code,c.code),ISNULL(b.aname,c.aname) 

輸出

code aname bname cname 
1 A aaa xxx 
1 A bbb yyy 
1 A NULL zzz 
2 B ccc www 
2 B ddd NULL 
3 C NULL NULL 
+1

你的查詢是正確的,只有一個問題是有代碼id 3我只需要一行。 –

+0

感謝它爲我工作。 –