【问题标题】:Will the following two queries give the same output consistently?以下两个查询是否会始终如一地给出相同的输出?
【发布时间】:2012-01-29 04:40:17
【问题描述】:

我们想找到那些拥有可以完成部门 20 员工完成的工作的员工的部门的部门号。

SELECT deptno
FROM   dept
WHERE  EXISTS(SELECT *
              FROM   emp x
              WHERE  x.deptno = 20
                     AND EXISTS(SELECT *
                                FROM   emp y
                                WHERE  y.job = x.job
                                       AND y.deptno = dept.deptno))
       AND deptno <> 20;

SELECT deptno
FROM   dept
WHERE  EXISTS(SELECT *
              FROM   emp x
              WHERE  x.deptno = dept.deptno
                     AND EXISTS(SELECT *
                                FROM   emp y
                                WHERE  y.job = x.job
                                       AND y.deptno = 20))
       AND deptno <> 20; 

【问题讨论】:

    标签: sql oracle exists not-exists


    【解决方案1】:

    是的,它们是等价的。它们也等价于:

    SELECT deptno
    FROM   dept
    WHERE  EXISTS ( SELECT *
                    FROM   emp x
                      JOIN emp y
                        ON y.job=x.job
                    WHERE  x.deptno = 20
                      AND  y.deptno = dept.deptno 
                  ) 
      AND  deptno <> 20;
    

    【讨论】:

      【解决方案2】:

      第一个查询查找部门 D,部门 20 中的员工 Y 与部门 D 中的员工 X 有相同的工作。

      第二个查询执行相同的操作,但切换了 X 和 Y。所以我认为它们是等价的。

      使用join 而不是not exists 子查询,查询可能更简单。例如,这在功能上是等效的:

      select  distinct dept.deptno
      from    dept
      join    emp x
      on      x.deptno = dept.deptno
      join    emp y
      on      y.deptno = 20
              and y.job = x.job
      where   dept.deptno <> 20
      

      【讨论】:

      • xy 不能相同,因为 x.deptno=20y.deptno&lt;&gt;20 或反之亦然。
      • @ypercube:好点子!看起来我误读了这个问题。我会编辑答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-22
      • 1970-01-01
      相关资源
      最近更新 更多