场景:
今天遇到一个很有意思的问题,记录一下,大概意思如下:
SELECT * FROM A WHERE ID NOT IN (SELECT ID FROM B);
A 表为主表,B表为子表,A表中肯定含有B表中没有的记录,但用上述语句就是查不出任何结果。
这是为什么呢?
通过查阅大佬的博客了解到,原来 NOT IN (子表结果集) ,就是等价于 WHERE ID <> B.ID, 这时如果子表结果集中含有 NULL ,也就是空的时候,就变成 <> NULL ,而由于NULL值不能参与比较运算符,所以导致条件不成立,从而查询不出来数据。
我的解释比较生硬,用大佬的例子比较清晰:
SELECT *
FROM dbo.TableA AS a
WHERE a.id NOT IN ( 2, NULL )
–-等同于:
SELECT *
FROM Table_A AS a
WHERE a.id <> 2
AND a.ID <> NULL
由于NULL值不能参与比较运算符,导致条件不成立,查询不出来数据。
参考:https://blog.csdn.net/coder_ocean/article/details/52281412