2011-12-28 22 views
2

我们希望找到有员工谁可以做的员工做了一些工作在depertment 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

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

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与员工的Y系20谁具有相同的那些部门的DEPTNO在部门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 
+0

'x'和'y'不能相同,因为'x.deptno = 20'和'y.deptno <> 20'或反之亦然。 – 2011-12-28 13:53:01

+0

@ypercube:好点!看起来像我误解了这个问题。我会编辑答案。 – Andomar 2011-12-28 14:01:21

相关问题