我使用以下命令创建了两个表:
select top 20 ord_pk into temporders from orders
select top 20 ord_pk into temporders1 from orders
现在我更改了temporders1表的not null约束,以允许空值和更新的最后5行temporders1表为NULL。
现在当我执行以下查询时:
select ord_pk
from temporders
where temporders.ord_pk not in
(
select ord_pk from temporders1
)
它没有输出任何行作为输出。
当我删除temporders1表中具有空值的所有行时,它将从temporders表中返回最后5个Ord_Pk。
我无法弄清楚它为什么这样做,因为我之前已经检查过任何表(temporders和temporders1)上没有主键或任何其他约束。
请帮助我理解背后的逻辑。
答案 0 :(得分:0)
检查此StackOverflow问题:NOT IN clause and NULL values
没有正确实现(例如,使用NULL
函数), ISNULL()
值不能在谓词中使用,因为它们总是计算为UNKNOWN,而谓词包含UNKNOWN结果,它也计算为UNKNOWN。
你可以通过运行这个简单的查询来证明我在说什么:
SELECT CASE WHEN NULL=NULL THEN 'equals'
WHEN NULL<>NULL THEN 'not equal'
WHEN NULL<NULL THEN 'less than'
WHEN NULL>NULL THEN 'greater than'
ELSE 'unknown' END
请注意,我所说的仅对服务器属性ANSI_NULLS的默认值有效。将ANSI_NULLS设置为OFF将产生不同的行为。