На самом деле, в нашей формулировке запроса из примера 14.6 есть одна неточность. Если у некоторого сотрудника номер отдела неизвестен (значение столбца EMP.DEPT_NO у соответствующей строки таблицы сотрудников является неопределенным), то бессмысленно вычислять средний размер зарплаты отдела этого сотрудника и находить размер зарплаты руководителя отдела. Формулировка из примера 14.6 приведет к правильному результату, но это неочевидно.1) Чтобы сделать формулировку более понятной (и, возможно, помочь системе выполнить запрос более эффективно), нужно воспользоваться предикатом IS NOT NULL и переписать запрос следующим образом:
SELECT EMP_NO, EMP_NAME, EMP_SAL FROM EMP WHERE DEPT_NO IS NOT NULL AND EMP_SAL BETWEEN (SELECT AVG(EMP1.EMP_SAL) FROM EMP EMP1 WHERE EMP.DEPT_NO = EMP1.DEPT_NO) AND (SELECT EMP1.EMP_SAL FROM EMP EMP1 WHERE EMP1.EMP_NO = ( SELECT DEPT.DEPT_MNG FROM DEPT WHERE DEPT.DEPT_NO = EMP.DEPT_NO ) );
Пример 14.7.
(html, txt)
SELECT EMP_NO, EMP_NAME FROM EMP WHERE DEPT_NO IS NULL;
Пример 14.8. Найти номера и имена служащих, номер отдела которых неизвестен. (html, txt)