SQL:“ NOT IN(SUBQUERY)”无法正常工作

use*_*148 0 sql sqlite

我在sqlite中面临以下难题,并且想知道sqlite方言是否缺少某些内容。

基本上,当我在一张表中要求总唯一值时,我得到一个数字。当我要求第二个表中存在的那些值的子集时,我得到的数字会减少。但是,当我要求对该子集的称赞时,我得到0。

考虑两个表A和B,它们具有不同但重叠的窗口小部件填充,这些窗口小部件由唯一的ID表示,我们可以将其称为Widget_ID。

我得到以下行为:

SELECT COUNT(DISTINCT WIDGET_ID)
FROM A
Run Code Online (Sandbox Code Playgroud)

输出:100

SELECT COUNT(DISTINCT WIDGET_ID)
FROM A
WHERE WIDGET_ID IN (SELECT WIDGET_ID FROM B)
Run Code Online (Sandbox Code Playgroud)

输出:75

SELECT COUNT(DISTINCT WIDGET_ID)
FROM A
WHERE WIDGET_ID NOT IN (SELECT WIDGET_ID FROM B)
Run Code Online (Sandbox Code Playgroud)

输出:0

这不是不可能吗?

Gor*_*off 5

出现问题的正常原因not inNULL价值观的存在。 由于比较不能成立NOT IN,因此列表始终总是失败。NULLNULL

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

SELECT COUNT(DISTINCT WIDGET_ID)
FROM A
WHERE WIDGET_ID NOT IN (SELECT WIDGET_ID FROM B WHERE WIDGET_ID IS NOT NULL);
Run Code Online (Sandbox Code Playgroud)

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

SELECT COUNT(DISTINCT WIDGET_ID)
FROM A
WHERE NOT EXISTS (SELECT WIDGET_ID FROM B WHERE B.WIDGET_ID = A.WIDGET_ID);
Run Code Online (Sandbox Code Playgroud)

  • NULL 有[一些不兼容性](http://www.sqlite.org/nulls.html),但是 IN 中 NULL 的处理在所有 DB 中都是一致的。 (2认同)
  • @用户1893148。。。基本上是“是”。NULL 的处理由 ANSI SQL 标准定义。有一些细微差别,但在所有数据库中,与“NULL”的比较都会返回“NULL”(相当于 false),除了“IS NULL”等特殊比较之外。 (2认同)