SQL:" NOT IN(SUBQUERY)"没有按预期工作

时间:2014-07-24 03:01:50

标签: sql sqlite

我在sqlite中面临以下难题,并想知道是否有关于sqlite方言的遗漏。

基本上,当我在一个表中询问总的唯一值时,我得到一个数字。当我要求第二个表中存在的那些值的子集时,我得到更小的数字。但是当我要求赞美那个子集时,我得到0。

考虑两个表,A和B,具有不同但重叠的小部件群,由唯一ID表示,我们可以称之为Widget_ID。

我收到以下行为:

SELECT COUNT(DISTINCT WIDGET_ID)
FROM A

输出:100

SELECT COUNT(DISTINCT WIDGET_ID)
FROM A
WHERE WIDGET_ID IN (SELECT WIDGET_ID FROM B)

输出:75

SELECT COUNT(DISTINCT WIDGET_ID)
FROM A
WHERE WIDGET_ID NOT IN (SELECT WIDGET_ID FROM B)

输出:0

难道这不可能吗?

1 个答案:

答案 0 :(得分:4)

not in出现问题的正常原因是NULL值存在。当列表具有NOT IN时,NULL总是失败,因为NULL比较不可能是真的。

您可以通过在外部过滤它们来解决此问题:

SELECT COUNT(DISTINCT WIDGET_ID)
FROM A
WHERE WIDGET_ID NOT IN (SELECT WIDGET_ID FROM B WHERE WIDGET_ID IS NOT NULL);

我更喜欢使用NOT EXISTS,因为它具有您期望的语义:

SELECT COUNT(DISTINCT WIDGET_ID)
FROM A
WHERE NOT EXISTS (SELECT WIDGET_ID FROM B WHERE B.WIDGET_ID = A.WIDGET_ID);