我想从目录中选择一些与两个表(Table1和Table2)无关的行。
目录中的行与使用字段idA
的表格相关。
我使用以下查询:
;with CTE(id) AS(
select distinct idA from Table1
union
select distinct idA from Table2
)
select * from Catalog where IdA NOT IN (select id from CTE)
非常奇怪的是,此查询不会返回任何结果。
如果我在de CTE之后使用以下查询,它将返回一些行
select Id from Catalog where not exists (select 1 from CTE where Catalog.IdA = CTE.Id);
有谁知道这是什么原因? AFAK这两个查询都是等价的。
当然第一个查询比第二个查询慢,但这不是很重要。重要的是,为什么这些查询不会返回相同的结果?
提及Table1的行数超过390万,这一点非常重要
但idA
只有139,283个不同的值。
表2只有几千行
任何帮助或评论将不胜感激
答案 0 :(得分:2)
如果NULL
子查询返回了一个或多个NOT IN
值,则谓词的结果是未知的而不是true或false,并且由于未满足的条件而没有返回任何行。最好避免NOT IN
使用可空表达式来避免这种非直观行为。
虽然略微冗长,但相关的NOT EXISTS
子查询将始终返回true或false并避免NULL
陷阱。