2011-12-28 50 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

相關問題