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

Предикат exists

SELECT DEPT.DEPT_NO

FROM DEPT, EMP

WHERE DEPT.DEPT_NO = EMP.DEPT_NO

GROUP BY DEPT.DEPT_NO

HAVING EXISTS (SELECT *

FROM EMP EMP1

WHERE EMP1.DEPT_NO <> DEPT.DEPT_NO

GROUP BY EMP1.DEPT_NO

HAVING MAX (EMP1.EMP_SAL)= AVG (EMP.EMP_SAL));

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

В этой формулировке основной интерес представляет подзапрос, в котором корреляция с внешним запросом происходит через вызов агрегатной функции от группы строк внешнего запроса. Здесь также можно избавиться от разделов GROUP BY и HAVING во внешнем запросе (пример 15.9.1):

SELECT DEPT.DEPT_NO

FROM DEPT

WHERE EXISTS (SELECT EMP.DEPT_NO

FROM EMP

WHERE EMP.DEPT_NO <> DEPT.DEPT_NO

GROUP BY EMP.DEPT_NO

HAVING MAX (EMP.EMP_SAL)=

(SELECT AVG (EMP1.EMP_SAL)

FROM EMP EMP1

WHERE EMP1.DEPT_NO = DEPT.DEPT_NO));

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