[英]SQL - EXISTS and NOT EXISTS with inequality
考虑拥有这两个表和以下查询:
SELECT Product. *
FROM Product
WHERE EXISTS
( SELECT *
FROM Codes
WHERE Product.P_code <> Codes.P_code)
和
SELECT Product. *
FROM Product
WHERE NOT EXISTS
( SELECT *
FROM Codes
WHERE Product.P_code <> Codes.P_code)
以下推理正确吗?
1,第一个查询将产生两个条目,因为Code中有两个P_code行与Product中的不相同。 2.子查询将返回两个条目,但是它们将被主查询中的NOT条件消除,这将返回零行。
我不确定这些查询中的推理如何工作。 我可以轻松预测查询何时将输出2或3行,但是我不知道查询可能会打印0或5行的情况下的工作方式(取决于EXISTS / NOT EXISTS条件和等号/不等号) 。
有人可以详细说明一下还是给我很好的阅读? 谢谢!
您的推理不正确。 但是,这很容易验证,因此您应该自己运行查询。
第一个查询将返回Product
所有行。 为什么? 因为对于每个代码,不等式为true的Codes
中至少有一行。 例如,代码'P_01'
与'P_03'
不匹配,因此存在不匹配的代码。
第二个查询将在Product
不返回任何行。 为什么? 因为每个产品代码都有一个不匹配的代码。 因为存在这样的代码,所以not exists
失败。
我建议您在exists
和not exists
陈述中坚持平等条件。 逻辑更容易遵循,更不容易出错。
如果内部查询返回至少一条记录,则EXISTS返回TRUE。
因此,在第一个查询中,EXISTS对所有产品返回TRUE,因为CODES中至少有一个记录与PRODUCT中的产品代码不匹配。
下面给出了一个简单的可视化。
相反,如果内部查询没有返回行,则NO EXISTS返回TRUE。 在上面的示例中,Inn没有这种情况,并且什么也不返回。
甲骨文的参考
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.