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