2

我们想找到那些拥有可以完成部门 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; 
4

2 回答 2

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
于 2011-12-28T13:27:50.003 回答
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;
于 2011-12-28T13:58:37.397 回答