以下两个查询是否会一致地提供相同的输出?

时间:2011-12-28 13:16:43

标签: sql oracle exists not-exists

我们希望找到那些有员工可以在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; 

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

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

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;