Будут ли следующие два запроса давать одинаковый результат последовательно? - PullRequest
2 голосов
/ 28 декабря 2011

Мы хотим найти подробную информацию о тех отделах, в которых есть сотрудники, которые могут выполнять какую-то работу, выполняемую сотрудником в отделе 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 ]

2 голосов
/ 28 декабря 2011

Да, они эквивалентны.Они также эквивалентны:

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 голосов
/ 28 декабря 2011

Первый запрос ищет отдел D с сотрудником Y в отделе 20, который выполняет ту же работу, что и сотрудник X в отделе D.

Второй запрос выполняет то же самое, но с переключенными 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
...