2012-02-16 15 views
2

所以我有兩個表,A和B,我試圖找到表A中不存在的值中存在的值表B中的匹配列我當前的代碼是:SQL,查找所有在另一個表中不存在的條目

SELECT A.x 
FROM A 
WHERE A.x NOT IN (SELECT B.x FROM B); 

我也有嘗試:

SELECT A.x 
FROM A 
WHERE EXISTS NOT (SELECT B.x FROM B); 

但是當我運行查詢,沒有在表中,我知道一個事實,即有A的「x」列中的值不在B的「x」列中,但沒有出現。

我有一種感覺,我正在做一些非常愚蠢的事情,或者錯過了顯而易見的答案,但是我很累,而且我一直在努力研究這個問題,以便長期關心,所以歡呼任何幫助=)

+1

這些表格之間有一個匹配字段?如果是的話,你可以做一個LEFT JOIN。 – Juanma 2012-02-16 13:21:43

+2

你的意思是「不存在」(不是「存在不」)? – 2012-02-16 13:30:24

+0

您的第一個查詢應該可以工作。第二個缺少'WHERE'(可能語法上不正確,除非'EXISTS NOT'是我不知道的MS Access特定的東西)。 – 2012-02-16 13:32:38

回答

4

您是否嘗試過使用OUTER JOIN

SELECT A.x 
FROM A LEFT OUTER JOIN B ON A.x = B.x 
WHERE B.x IS NULL 
+0

我現在試試吧 – 2012-02-16 13:34:50

+0

甜,這似乎奏效了,歡呼着男人 – 2012-02-16 13:38:37

2

難道B.x中有null的值嗎?如果是這樣,not in倒像是:

a.x not in (1, 2, 3, null, ...) 

這是簡寫:

a.x <> 1 and a.x <> 2 and a.x <> 3 and a.x <> null and ... 

因爲anything <> null評估爲unknown,該not in條件是不正確的。結果是一個空的行集。這是三個有價值的邏輯令人不快的副作用,甚至讓有經驗的SQL開發人員感到意外。

一種解決辦法是排除null值,如:

SELECT x FROM A WHERE x NOT IN (SELECT x FROM B where x is not null) 

有關詳細信息,請參閱the Wikidia article on three-valued logic

+0

不,沒有空的條目,我可以看到 – 2012-02-16 13:34:40

+0

我敢打賭有。試試看:'SELECT x FROM B WHERE x is NULL' – 2012-02-16 13:43:27

相關問題