你能在同一个查询中使用NOT IN和NOT EXISTS吗?

时间:2015-08-23 10:17:06

标签: sql database

理论上,你可以同时在子查询中使用NOT IN和NOT EXISTS作为同一查询的一部分吗?

3 个答案:

答案 0 :(得分:1)

,你可以。

WHERE EXISTS (SELECT * FROM cities_stores
                WHERE cities_stores.store_type = stores.store_type) and stores.store_type NOT IN(...);

答案 1 :(得分:0)

为什么不..

CREATE TABLE Test9 (ID int)

INSERT INTO Test9 values (1), (2), (3), (4)

SELECT * 
FROM test9 
WHERE id NOT IN (1) 
 AND EXISTS (SELECT 1 FROM test9 WHERE id = 1)

答案 2 :(得分:0)

当然可以,但要注意两者之间在空(NULL)属性方面的差异。在那里你可以获得混合的结果。当子查询返回一个null时,NOT IN将不匹配任何行。

通过查看NOT IN操作实际意义的细节,可以找到原因。

让我们说,为了说明的目的,表中有4行叫做t,有一个名为ID的列,其值为1..4

WHERE SomeValue NOT IN (SELECT AVal FROM t)

相当于

WHERE SomeValue != (SELECT AVal FROM t WHERE ID=1)
  AND SomeValue != (SELECT AVal FROM t WHERE ID=2)
  AND SomeValue != (SELECT AVal FROM t WHERE ID=3)
  AND SomeValue != (SELECT AVal FROM t WHERE ID=4)

让我们进一步说AVal是NULL,其中ID = 4.因此,!=比较返回UNKNOWN。 AND的逻辑真值表表明UNKNOWN和TRUE是UNKNOWN,UNKNOWN和FALSE是FALSE。没有值可以与UNKNOWN进行AND运算以产生结果TRUE

因此,如果该子查询的任何行返回NULL,则整个NOT IN运算符将计算为FALSE或NULL,并且不会返回任何记录

有关详细信息,请查看this帖子。