我在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
这不是不可能吗?
出现问题的正常原因not in是NULL价值观的存在。 由于比较不能成立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)
| 归档时间: |
|
| 查看次数: |
1769 次 |
| 最近记录: |