2012-02-16 45 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

相关问题