所以我有两个表,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”列中,但是没有显示
我有一种感觉,我正在做一些非常愚蠢的事情,或者错过了明显明显的答案,但是我已经厌倦了,而且我一直在努力解决这个问题,所以对任何帮助的欢呼= )
答案 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。