当我为我认为相同的查询一个使用not in where约束而另一个使用left join. 约束中的表not in有一个空值(错误数据),导致该查询返回 0 条记录。我有点理解为什么,但我可以使用一些帮助来完全掌握这个概念。
not in
where
left join
简单地说,为什么查询 A 返回结果而 B 没有?
A: select 'true' where 3 in (1, 2, 3, null) B: select 'true' where 3 not in (1, 2, null)
这是在 SQL Server 2005 上。我还发现调用set ansi_nulls off会导致 B 返回结果。
set ansi_nulls off
查询 A 与以下内容相同:
select 'true' where 3 = 1 or 3 = 2 or 3 = 3 or 3 = null
既然3 = 3是真的,你就会得到一个结果。
3 = 3
查询 B 与以下内容相同:
select 'true' where 3 <> 1 and 3 <> 2 and 3 <> null
何时ansi_nulls打开,3 <> null为 UNKNOWN,因此谓词计算结果为 UNKNOWN,并且您不会得到任何行。
ansi_nulls
3 <> null
何时ansi_nulls关闭,3 <> null则为真,因此谓词评估为真,并且您得到一行。