当我认为两个查询是相同的,一个使用not in
约束条件,另一个使用left join
时,发现它们返回了不同的记录数,这个问题就出现了。在not in
约束条件下的表中有一个空值(坏数据),导致该查询返回0条记录的计数。我大致理解了其中的原因,但仍需要一些帮助来完全掌握这个概念。
简单地说,为什么查询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返回一个结果。