理论上,你可以同时在子查询中使用NOT IN和NOT EXISTS作为同一查询的一部分吗?
答案 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帖子。