我有一個表A和一個表B.我想將A連接到B但只需要連接不可能的結果。我試過SQL加入以返回不匹配發生的結果
SELECT B.*
FROM A
RIGHT JOIN B ON A.KEY = B.KEY
WHERE A.KEY IS NULL
這應該可以,但它不會。我的SQL是否正確?
我有一個表A和一個表B.我想將A連接到B但只需要連接不可能的結果。我試過SQL加入以返回不匹配發生的結果
SELECT B.*
FROM A
RIGHT JOIN B ON A.KEY = B.KEY
WHERE A.KEY IS NULL
這應該可以,但它不會。我的SQL是否正確?
你沒有說你是「沒有工作」的意思,但如果這些查詢:
SELECT B.*
FROM A
RIGHT JOIN B ON A.KEY = B.KEY
WHERE A.KEY IS NULL
SELECT A.*
FROM A
LEFT JOIN B ON A.KEY = B.KEY
WHERE B.KEY IS NULL
返回任何結果,這意味着,在固體表中的每個密鑰與匹配外部連接表中至少有一個鍵。
如果你想找到A或B有在其他沒有匹配行的行,你需要像一個查詢:
SELECT A.*, B.*, CASE WHEN A.KEY IS NULL THEN 'in B but not A' WHEN B.KEY IS NULL THEN 'in B but not A' END as explanation
FROM A
FULL OUTER JOIN B ON A.KEY = B.KEY
WHERE A.KEY IS NULL OR B.KEY IS NULL
你可能會聽到人們說:「但是,一鍵永遠不能爲空,因爲這是一個關鍵所在/主鍵不能爲空!「 - 是的,但我們正在加入;它們是表中的主鍵,但在連接發生後它們不一定是主鍵。數據庫將非常樂意爲B(包括b.key列)生成一行充滿NULL值的行,如果在B中沒有行的鍵等於該值a.key - 這意味着表的關鍵不再是聯接的關鍵,並且它允許爲空
您可以測試空對比另一列的關鍵嗎?是的,但除非表中的其他列不是NULLABLE,否則如果要查找不匹配的行,則鍵列是最好的選擇。這是因爲它是我們可以保證在兩個表連接的情況下包含null的唯一列,並且此表中沒有與其他表匹配的數據。爲了更好地解釋,這裏是一些數據:
A
key|val
-------
000|hello
001|world
B
key|val
-------
000|hello
002|there
如果A或B中的key
列包含NULL,則該行絕不會出現在連接結果中
感謝這個詳細的答案! –
找到了答案。
這是不工作的原因是因爲我在JOIN上使用AND條件,而不是在WHERE子句中。
無論如何,謝謝大家!
所以你發佈了一個「不能正常工作」的查詢,它*實際上並不是你正在運行的查詢*?哦,親愛的.. –
的確,您的原始片段甚至沒有「AND」條件? – BenM
我試圖簡化它,使人們更容易回答。對不起,我會盡可能刪除。 –
如何加入'null'鍵? – BenM
它返回什麼? –
我認爲它不起作用,因爲'A.KEY = B.KEY'在'A.KEY'爲空時不起作用,因爲您不能使用=來比較NULL值。 https://dev.mysql.com/doc/refman/5.7/en/working-with-null.html – ADyson