我有这张桌子:
select count(distinct clean_deep_link) from tbl_1;
+---------------------------------+
| count(distinct clean_deep_link) |
+---------------------------------+
| 121211 |
+---------------------------------+
Run Code Online (Sandbox Code Playgroud)
我有这个问题:
select count(1) from tbl_1 where clean_deep_link IN
(select clean_deep_link from tbl_2);
+----------+
| count(1) |
+----------+
| 66360 |
+----------+
Run Code Online (Sandbox Code Playgroud)
但是当我将查询更改为not in它时,返回一个空集:
select count(1) from tbl_1
where clean_deep_link not in (select clean_deep_link from tbl_2);
+----------+
| count(1) |
+----------+
| 0 |
+----------+
Run Code Online (Sandbox Code Playgroud)
这怎么可能?如果子查询包含大约一半的记录,那么子查询中是否应该not包含另一半?我在这里错过了什么?
谢谢
我认为这tbl_1.clean_deep_link是NULL其余的行.
这些值既不IN是NOT IN您的子查询也不是您的子查询.
另一个原因可能是,你有NULL在tbl_2.clean_deep_link.
请尝试以下方法:
select count(1) from tbl_1
where clean_deep_link not in (select clean_deep_link
from tbl_2 WHERE clean_deep_link IS NOT NULL);
Run Code Online (Sandbox Code Playgroud)
问题NULL在于它既不是=,也不是<>任何其他价值(包括NULL).
在检查时NOT IN,MySQL需要检查每个值,tbl_1因为它不包含在内tbl_2,因此检查它们是否存在<>.
你的价值观没有 <> NULL,所以他们没有 NOT IN.
另请参阅:使用带空值的NOT IN运算符
检查SQL Fiddle中的示例.