2016-05-23 25 views
1

我需要能夠顯示實際上不存在於第二個表中的行的結果。我嘗試過左連接,但它似乎不適合我需要做的事情。我有2個表,例如:SQL |第二個表沒有匹配行時是否加入左連接?

Table1 
NAME | KEY 
John 12345 
Frank 23456 

Table2 
KEY | LIST | STATUS 
12345 10001 1 
12345 10003 0 
23456 10001 1 
23456 10002 1 

我需要能夠顯示的結果是這樣的:

NAME | KEY | LIST | STATUS 
John 12345 10001 1 
John 12345 10002 (null) 
John 12345 10003 0 
Frank 23456 10001 1 
Frank 23456 10002 1 
Frank 23456 10003 (null) 

但我無法弄清楚如何做到這一點,因爲這些記錄,將返回一個空值實際上不存在於第二個表中。如果我一次只運行一個,我可以通過做一個UNION ALL來獲得我需要的結果,但這不是有效的(我還必須重新排序我的結果,這也使得它更難)

SELECT b.list, a.name, a.key, b.status 
FROM table1 a JOIN table2 b ON a.key = b.key 
WHERE a.name = 'John' 
UNION ALL 
SELECT distinct(b.list), NULL AS "a.name", NULL AS "a.key", NULL AS "b.status" 
FROM table2 b 

這不是一個理想的解決方案,因爲我拉動了其餘的列表,但其他字段最終爲空,因此當我將結果移動到excel時,我必須手動粘貼它們。

任何想法?我真的認爲我應該可以通過左連接來完成這項工作,但是我似乎沒有做任何工作。

+0

您使用的是什麼版本的SQL? –

回答

0

嘗試FULL OUTER JOIN

例子:

SELECT A.NAME, A.KEY, A.LIST, B.STATUS 
FROM Table1 A 
FULL OUTER JOIN Table2 B 
ON A.KEY = B.KEY AND A.LIST = B.LIST 

如果不希望第二個錶行,他們還沒有在第一個表的引用添加條件:

WHERE A.KEY IS NOT NULL 
3

使用cross join獲取所有行。然後使用left join引入現有值:

select t1.key, l.list, t2.status 
from table1 t1 cross join 
    (select distinct list from table2) l left join 
    table2 t2 
    on t1.key = t2.key and t1.list = t2.list; 
+0

我給了你一個upvote,但是你可以給你增加一點解釋,說明你在做什麼,爲什麼。 – Alex

+0

第一句話是總結。 。 。 'cross join'創建你想要的所有行,每個'list'和每個'key'。然後'left join'從表格中提取數據。 –

0

這是我想出來的。前兩個查詢用於將NAME,KEY和LIST的所有可能組合一起使用。最後一個查詢返回到Table2以獲取STATUS,在STATUS不存在的情況下返回NULL。

;WITH Lists 
AS 
(
    SELECT DISTINCT LIST 
    FROM Table2 
), 
KeyList AS 
(
    SELECT [NAME], [KEY], [LIST] 
    FROM Lists CROSS JOIN Table1 
) 
SELECT a.[NAME], a.[KEY],A.[LIST],b.[STATUS] 
FROM KeyList a 
LEFT JOIN Table2 b 
ON a.[KEY] = b.[KEY] 
AND a.[LIST] = b.[LIST] 
相關問題