选择身份不在(...)的地方有什么限制? - 不在VS而不是EXISTS

时间:2017-08-29 17:00:46

标签: sql-server sql-server-2008

我想从目录中选择一些与两个表(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只有几千行

任何帮助或评论将不胜感激

1 个答案:

答案 0 :(得分:2)

如果NULL子查询返回了一个或多个NOT IN值,则谓词的结果是未知的而不是true或false,并且由于未满足的条件而没有返回任何行。最好避免NOT IN使用可空表达式来避免这种非直观行为。

虽然略微冗长,但相关的NOT EXISTS子查询将始终返回true或false并避免NULL陷阱。