logo
Лабы базы Данных / Базы данных / Введение в модель данных SQL

Предикат in

SELECT DEPT.DEPT_NO

FROM DEPT, EMP

WHERE DEPT.DEPT_NO = EMP.DEPT_NO

GROUP BY DEPT.DEPT_NO

HAVING AVG(EMP.EMP_SAL) IN

(SELECT MAX(EMP1.EMP_SAL)

FROM EMP, DEPT DEPT1

WHERE EMP.DEPT_NO = DEPT1.DEPT_NO

AND DEPT1.DEPT_NO <> DEPT.DEPT_NO

GROUP BY DEPT.DEPT_NO);

Пример 15.7. Найти номера отделов, в которых средний размер зарплаты сотрудников равен максимальному размеру зарплаты сотрудников какого-либо другого отдела. (html,txt)

Этот запрос, помимо прочего, демонстрирует наличие в условии раздела HAVING вложенного подзапроса с корреляцией. Как и раньше, можно избавиться от разделов GROUP BY и HAVING во внешнем запросе (пример 15.7.1):

SELECT DEPT.DEPT_NO

FROM DEPT

WHERE (SELECT AVG(EMP_SAL)

FROM EMP

WHERE EMP.DEPT_NO = DEPT.DEPT_NO) IN

(SELECT MAX(EMP1.EMP_SAL)

FROM EMP, DEPT DEPT1

WHERE EMP.DEPT_NO = DEPT1.DEPT_NO

AND DEPT1.DEPT_NO <> DEPT.DEPT_NO

GROUP BY DEPT.DEPT_NO);

Пример 15.7.1. (html,txt)

Но в данном случае мы не можем отказаться от раздела GROUP BY во втором вложенном запросе, поскольку без этого невозможно получить множество значений результатов вызова агрегатной функции.