让我们假设这些值是common_id:
Common - 1
Table1 - 2
Table2 - 3, null
我们希望返回Common中的行,因为其他任何表中都不存在该行。但是,零头会带来活动扳手。
使用这些值,查询等同于:
select *
from Common
where 1 not in (2)
and 1 not in (3, null)
这等效于:
select *
from Common
where not (1=2)
and not (1=3 or 1=null)
这是问题开始的地方。与null比较时,答案未知。因此查询减少为
select *
from Common
where not (false)
and not (false or unkown)
错误或未知未知:
select *
from Common
where true
and not (unknown)
真实且不未知也未知:
select *
from Common
where unknown
where条件不会返回结果未知的记录,因此我们不会返回任何记录。
解决此问题的一种方法是使用exist运算符,而不是in。Exists永远不会返回未知,因为它对行而不是列进行操作。(行要么存在,要么不存在;在行级别没有任何这种空歧义!)
select *
from Common
where not exists (select common_id from Table1 where common_id = Common.common_id)
and not exists (select common_id from Table2 where common_id = Common.common_id)