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

はい、同等です。また、以下と同等です。

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 に答える
2

最初のクエリは、部門 D の従業員 X と同じ仕事をしている部門 20 の従業員 Y を持つ部門 D を検索します。

2 番目のクエリは同じことを行いますが、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 に答える