2013-02-10 23 views
2

我試圖制定一個SQL FULL OUTER JOIN,它包括表A和表B中的所有值,但不包括它們之間通用的值。忽略常見記錄的SQL外部聯接

我已經在網上搜索,並偶然發現了下面的SQL代碼:

SELECT * FROM TableA 
FULL OUTER JOIN TableB 
ON TableA.name = TableB.name 
WHERE TableA.id IS null 
OR TableB.id IS null 

哪位能像這樣來說明:

enter image description here

我不知道我理解的IS null部分。 SQL是否可以通過簡單地將以下內容陳述爲WHERE條件來執行? :

回答

2

它是什麼你不明白IS NULL子句?

在OUTER JOIN(左,右,滿)中,外表中的列可能最終爲NULL。

的條款

WHERE TableA.id IS null 
OR TableB.id IS null 

簡單地說,ID中的一個必須是空的,即如果您有來自TableA的一行,則不能在TableB中存在匹配的行,反之亦然。

+0

我不明白的是,根據維恩圖,你會想要在TableA和TableB中的值,但是你不想要在兩者中都是常見的值。我不明白null與我看到的 – 2013-02-10 19:52:18

+0

有什麼關係!假設您從TableA中選擇一列,從TableB中選擇一列。這意味着你的結果集是一個包含兩列的表格。如果你做一個INNER JOIN,那麼兩列都會被填充,但是如果你做了任何一種OUTER JOIN,你會在沒有匹配記錄的列中放入什麼?空值!維基百科文章中的表格應該可以幫助您將其視覺化:http://en.wikipedia.org/wiki/Outer_join#Outer_joins – 2013-02-10 19:56:56

+0

非常感謝您的解釋! :) – 2013-02-10 20:01:19

0
SELECT Name, ID FROM TableA UNION SELECT Name, ID FROM TableB 
EXCEPT 
SELECT Name, ID FROM TableB INTERSECT SELECT Name, ID FROM TableA 

第一個select從表A和表B中獲取所有行,並將其組合到1個結果集中。 第二個選擇選擇兩個之間共同的所有行。 除了從第一個select中選擇所有行外 - 第二個select中的所有行。

你最終得到的是所有行 - 這兩個表之間通用的行。

+0

MySQL不支持'EXCEPT'操作符。 – 2013-02-10 20:21:03