SQL,查找另一个表中不存在的所有条目

时间:2012-02-16 13:18:32

标签: sql ms-access

所以我有两个表,A和B,我试图找到表A中列中存在的值,这些值在表B的匹配列中不存在,我当前的代码是:

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”列中,但是没有显示

我有一种感觉,我正在做一些非常愚蠢的事情,或者错过了明显明显的答案,但是我已经厌倦了,而且我一直在努力解决这个问题,所以对任何帮助的欢呼= )

2 个答案:

答案 0 :(得分:4)

您是否尝试使用OUTER JOIN

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

答案 1 :(得分:2)

null中可能有B.x个值吗?如果是这样,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