我在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
难道这不可能吗?
答案 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);