【问题标题】:ORACLE EXIST (Subquery)ORACLE EXIST(子查询)
【发布时间】:2019-03-13 06:02:55
【问题描述】:

据我所知,SQL EXISTS 条件与子查询结合使用,如果子查询返回至少一行,则认为满足条件。

那为什么这些代码会给出不同的结果呢?

/* #1 */
SELECT * FROM employees
WHERE EXISTS(
SELECT * FROM employees
WHERE employees.department_id= 20);

/* #2 */
SELECT * FROM employees
WHERE EXISTS(
SELECT * FROM departments
WHERE employees.department_id= 20);

我想如果任何子查询返回任何他们评估为 TRUE 的行。因此,外部查询将返回员工表中的所有行。

但是,只有 #1 代码会返回员工表中的所有行。 #2 返回具有 department_id=20 的 ros。

【问题讨论】:

  • 你到底想在这里做什么?这些陈述对我来说都没有意义。

标签: sql oracle exists


【解决方案1】:

关键部分是不正确的限定名称:

SELECT * FROM employees
WHERE EXISTS(
SELECT * FROM departments
WHERE employees.department_id= 20);
      -- here should be departments.department_id

您指的是外部查询中的列。你想要的是:

SELECT * FROM employees
WHERE EXISTS(
SELECT * FROM departments
WHERE departments.department_id= 20);

【讨论】:

    【解决方案2】:

    查询 2 应该是:

    SELECT * FROM employees
    WHERE EXISTS(
                 SELECT * FROM departments
                 WHERE departments.department_id= 20)
    

    您正在使用员工别名,因此当员工 department_id 与 20 不同时,子查询不会返回任何行,无论条件是在子查询内部而不是在外部查询中。

    【讨论】:

    • 这真的没有意义。它说“如果(至少)有一个 id = 20 的部门,则返回所有员工 - 但我不在乎是否有任何员工分配给该部门”。因此,如果没有具有该 ID 的部门,即使有很多员工,查询也不会返回任何内容
    • 同意,完全没有意义,但似乎 op 只是想了解存在
    【解决方案3】:

    这是您的第一个查询:

    SELECT e.*
    FROM employees e
    WHERE EXISTS (SELECT 1
                  FROM employees e2
                  WHERE e2.department_id = 20
                 );
    

    在这个查询中,内部WHERE 指的是内部表。所以可能会发生以下两种情况之一:

    • employees 在该部门有一名员工。在这种情况下,所有员工都会在外部查询中返回。
    • employees 在该部门没有员工。在这种情况下,外部查询中不会返回任何员工。

    这是非此即彼的。

    第二个查询是:

    SELECT e.*
    FROM employees e
    WHERE EXISTS (SELECT 1
                  FROM departments d
                  WHERE e.department_id = 20
                 );
    

    内部引用指向外部查询。对于employees 中的每一行,查询都会查看子查询是否返回任何行。如果是,则返回该行。

    子查询将返回来自departments 的所有行(如果外部查询中的员工有department_id = 20)或不返回任何行。所以,这相当于:

    SELECT e.*
    FROM employees e
    WHERE e.department_id = 20;
    

    【讨论】:

      猜你喜欢
      • 2017-05-28
      • 2013-11-22
      • 2011-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多