考虑使用这两个表和以下查询:
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.第一个查询将生成两个条目,因为代码中有两个与Product中的P_code行不同的P_code行。 2.子查询将返回两个条目,但它们将被主查询中的NOT条件消除,它将返回零行。
我不确定这些查询中的推理是如何工作的。我可以很容易地预测查询何时会打印出2行或3行,但我不知道它在打印0行或5行的情况下是如何工作的(取决于EXISTS / NOT EXISTS条件和相等/不等号) 。
有人可以详细说明这个或给我一个好的阅读吗?谢谢!
答案 0 :(得分:2)
你的推理不正确。但是,这很容易验证,因此您应该自己运行查询。
第一个查询将返回Product
中的所有行。为什么?因为对于每个代码,Codes
中至少有一行不等式为真。例如,代码'P_01'
与'P_03'
不匹配,因此存在不匹配的代码。
第二个查询将不会在Product
中返回任何行。为什么?因为每个产品代码都有不匹配的代码。由于此类代码存在,not exists
失败。
我建议你在exists
和not exists
陈述中坚持平等条件。逻辑更易于遵循,不易出错。
答案 1 :(得分:1)
如果内部查询返回至少一条记录,则EXISTS返回TRUE。
因此,在第一次查询中,EXISTS对所有产品都返回TRUE,因为CODES中至少有一条记录与PRODUCT中的产品代码不匹配。
下面给出的简单可视化。
相反,如果没有从内部查询返回的行,则NO EXISTS返回TRUE。上面的例子没有这种情况,也没有返回。
来自oracle
的参考资料