【问题标题】:Interpreting EXISTS Keyword解释 EXISTS 关键字
【发布时间】:2019-12-04 17:54:50
【问题描述】:

如果 EXISTS 关键字仅计算为 True 或 False,为什么下面的查询会返回所有具有匹配 id 的指定列而不是所有指定列?

SELECT first_name,
       last_name
FROM employees
WHERE EXISTS (
    SELECT id
    FROM retirees
    WHERE id = employees.id);

因为如果是这种情况,那么不应该将查询评估为:

SELECT first_name,
       last_name
FROM employees
WHERE EXISTS (
    TRUE);

【问题讨论】:

  • retireesid 列吗?如果不是,那么您就犯了一个典型的错误(因为子查询可以愉快地从外部查询中引用id,当它不合格时)。如果这不是问题,您可能需要解释更多,包括示例数据、预期结果等
  • EXISTS 不像第二个示例那样简单地返回TRUE。它将返回的员工限制为具有 id 匹配 retirees 条目的员工。换句话说,它返回所有employees,其中retirees 中的匹配条目存在。这和WHERE TRUE不一样
  • 感谢 h0r53。它的声明式风格有时让我感到困惑。

标签: sql exists


【解决方案1】:

EXISTS 不像第二个示例那样简单地返回TRUE。它将返回的employees 限制为ID 与retirees 条目匹配的那些。换句话说,它返回所有employees,其中retirees 中的匹配条目存在。这与WHERE TRUE 不同。

虽然EXISTS 具有布尔属性,但本示例中的TRUE 或FALSE 评估决定了employees 的条目是否应包含在结果中。 WHERE TRUE 表单将导致 employees 表的所有行返回,这肯定不是 EXISTS 正在做的事情,正如您可能从查询结果中看到的那样。

您可以将EXISTS 视为一个子句,它将根据EXISTS 条件匹配原始数据集的子集。

【讨论】:

    【解决方案2】:

    您使用exists 的方式是在corelated subquery 中。 exists 的运行并没有结束,而是回溯到每次运行时所有的employees id 都与retires table 匹配。因此,您将获得 o/p 作为与 retires 匹配的所有员工 ID。

    【讨论】:

      【解决方案3】:

      第一个代码将为您选择从员工中具有 id 的所有行到表 retirees 中。过滤器会这样。

      如果您想查看哪些记录不在退休人员的表中,您应该添加not

      像这样:

      SELECT first_name,
             last_name
      FROM employees
      WHERE NOT EXISTS (
          SELECT id
          FROM retirees
          WHERE id = employees.id);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-14
        • 2023-03-05
        • 1970-01-01
        • 1970-01-01
        • 2016-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多