【问题标题】:SQL - EXISTS and NOT EXISTS with inequalitySQL - EXISTS 和 NOT EXISTS 不等式
【发布时间】:2015-02-17 22:11:45
【问题描述】:

考虑拥有这两个表和以下查询:

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.第一个查询将产生两个条目,因为 Codes 中有两个 P_code 行与 Product 中的行不同。 2. 子查询将返回两个条目,但它们会被主查询中的 NOT 条件消除,这将返回零行。

我不确定这些查询中的推理是如何工作的。我可以很容易地预测查询何时会打印出 2 或 3 行,但我不知道它在打印 0 或 5 行的情况下是如何工作的(取决于 EXISTS/NOT EXISTS 条件和等式/不等式符号) .

有人可以详细说明这一点或给我发一份好的阅读材料吗?谢谢!

【问题讨论】:

    标签: mysql sql database select exists


    【解决方案1】:

    你的推理不正确。但是,这很容易验证,因此您应该自己运行查询。

    第一个查询将返回Product 中的所有行。为什么?因为对于每个代码,Codes 中至少有一行不等式为真。比如代码'P_01'不匹配'P_03',所以存在不匹配的代码。

    第二个查询将不返回 Product 中的任何行。为什么?因为每个产品代码都有一个不匹配的代码。因为存在这样的代码,所以not exists 失败。

    我建议您在 existsnot exists 语句中坚持相等条件。逻辑更容易理解,更不容易出错。

    【讨论】:

    • 谢谢!由于我的期末考试,我需要知道这些查询背后的原因,我很可能永远不会在实践中使用这种格式(带有不等号)。
    【解决方案2】:

    如果内部查询返回至少一条记录,则 EXISTS 返回 TRUE。

    所以在第一个查询中,EXISTS 对所有产品都返回 TRUE,因为 CODES 中至少有一条记录与 PRODUCT 中的产品代码不匹配。

    下面给出了一个简单的可视化。

    相反,如果内部查询没有返回任何行,则 NO EXISTS 返回 TRUE。在上面的例子中,没有这种情况,也不返回任何内容。

    来自oracle的参考

    【讨论】:

    • 重新阅读 sql - 查询包括不等式,而不是等式。 Product.P_code &lt;&gt; Codes.P_code
    • 谢谢。编辑评论
    猜你喜欢
    • 2021-08-29
    • 2011-05-26
    • 1970-01-01
    • 2013-04-17
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    • 2016-07-22
    • 2021-05-29
    相关资源
    最近更新 更多