你可以在同一个查询中使用 NOT IN 和 NOT EXISTS 吗?
Posted
技术标签:
【中文标题】你可以在同一个查询中使用 NOT IN 和 NOT EXISTS 吗?【英文标题】:Can you use NOT IN and NOT EXISTS in the same query? 【发布时间】:2015-08-23 10:17:05 【问题描述】:理论上,您能否将 NOT IN 和 NOT EXISTS 用作同一查询的一部分,或许在子查询中?
【问题讨论】:
是的,你可以,SELECT * FROM mytable WHERE col NOT IN ('a', 'b') AND NOT EXISTS (SELECT * FROM anothertable WHERE anothertable.col2=mytable.col2)
【参考方案1】:
是的,你可以。
WHERE EXISTS (SELECT * FROM cities_stores
WHERE cities_stores.store_type = stores.store_type) and stores.store_type NOT IN(...);
【讨论】:
【参考方案2】:当然可以,但请注意两者在空 (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 帖子了解更多信息。
【讨论】:
【参考方案3】:为什么不..
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)
【讨论】:
以上是关于你可以在同一个查询中使用 NOT IN 和 NOT EXISTS 吗?的主要内容,如果未能解决你的问题,请参考以下文章