现象:

select * from HouseInstrumentChaoBiao where id in(934601,934602) and id not in (select Inid from customer_account where Inid in(934601,934602))
查询结果是包含inid值为934601一个行;
但是当查询改为
select * from HouseInstrumentChaoBiao where id in(934601,934602) and id not in (select Inid from customer_account)
发现,查询没有结果行。
疑惑:按理说查询二的not in 子查询是包含范围更大的集合,但为什么偏偏没结果了呢?

解答:

原因是 表customer_account 的 Inid 字段存在至少一条 NULL 值,这是关键:
NOT IN (A,B,NULL) 逻辑等价于:
id <> A AND id <> B AND id <> NULL
SQL 中任何值 <> NULL 结果都是 UNKNOWN(未知)
WHERE 条件只接受 TRUE,整条判定整体变为 UNKNOWN,所有行都不匹配,最终无结果

补充:

为什么你会误以为是 SQL Server Bug
绝大多数开发不清楚 NULL 三值逻辑(TRUE / FALSE / UNKNOWN)
IN 不受子查询 NULL 影响,只有 NOT IN 会触发这个诡异空结果现象
该行为是 ANSI SQL 标准规定,不是数据库引擎缺陷,SQL Server 2008~2025 全部一致

posted on 2026-06-27 17:56  hrx521  阅读(12)  评论(0)    收藏  举报