2017-08-23 29 views
-2

我有一個表A和一個表B.我想將A連接到B但只需要連接不可能的結果。我試過SQL加入以返回不匹配發生的結果

SELECT B.* 
     FROM A 
RIGHT JOIN B ON A.KEY = B.KEY 
    WHERE A.KEY IS NULL 

這應該可以,但它不會。我的SQL是否正確?

+2

如何加入'null'鍵? – BenM

+0

它返回什麼? –

+0

我認爲它不起作用,因爲'A.KEY = B.KEY'在'A.KEY'爲空時不起作用,因爲您不能使用=來比較NULL值。 https://dev.mysql.com/doc/refman/5.7/en/working-with-null.html – ADyson

回答

2

你沒有說你是「沒有工作」的意思,但如果這些查詢:

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 
  • 如果這兩個表是INNER JOINED,只有行000將導致
  • 如果這兩個表是左連接乙ON A.KEY = B/KEY WHERE B.KEY IS NULL,第001行將導致
  • 如果這兩個表是A RIGHT JOIN BO ÑA.KEY = B/KEY WHERE A.KEY IS NULL,行002將導致
  • 如果這兩個tagbles是全外加入其中a或b鍵爲null,行001和002將導致

如果A或B中的key列包含NULL,則該行絕不會出現在連接結果中

+0

感謝這個詳細的答案! –

-3

找到了答案。

這是不工作的原因是因爲我在JOIN上使用AND條件,而不是在WHERE子句中。

無論如何,謝謝大家!

+3

所以你發佈了一個「不能正常工作」的查詢,它*實際上並不是你正在運行的查詢*?哦,親愛的.. –

+0

的確,您的原始片段甚至沒有「AND」條件? – BenM

+0

我試圖簡化它,使人們更容易回答。對不起,我會盡可能刪除。 –

相關問題