当我获得不同的记录计数时,出现了这个问题,我认为这是相同的查询,一个使用not in where约束,另一个使用a 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是未知的,所以谓词计算结果为未知的,你没有得到任何行。
ansi_nulls
3 <> null
当ansi_nullsoff3 <> null为true时,谓词为true,因此谓词的值为true,您将获得一行。