Найдите всех сотрудников с окладом больше среднего в своем отделе.
В примере на рисунке определяются сотрудники с окладом больше среднего в своем отделе. В данном случае коррелированным подзапросом вычисляется средний оклад для каждого отдела.
Так как и внешним, и внутренним запросом используется таблица EMPLOYEES
в предложении FROM
, таблице EMPLOYEES
во внешней инструкции SELECT
присваивается для ясности псевдоним. Псевдоним делает всю инструкцию SELECT
более понятной.
Без псевдонима запрос не работал бы надлежащим образом, поскольку внутренняя инструкция не смогла бы отличить столбец внутренней таблицы от столбца внешней таблицы.
Примеры коррелированных подзапросов
Выведите сведения о сотрудниках, хотя бы дважды сменивших должность.
В примере на рисунке отображаются сведения о сотрудниках, которые хотя бы дважды сменили должность. Коррелированный подзапрос выполняется сервером Oracle следующим образом:
-
Выбирается строка из таблицы, заданной во внешнем запросе. Это будет текущая строка- кандидат.
-
Из этой строки-кандидата сохраняется значение столбца, упоминаемого в подзапросе. (В примере на рисунке столбцом, упоминаемым в подзапросе, является столбец
E.EMPLOYEE_ID
.) -
Выполняется подзапрос с его условием, ссылающимся на значение из строки-кандидата внешнего запроса. (В примере на рисунке групповая функция
COUNT(*)
вычисляется на основе значения столбцаE.EMPLOYEE_ID
, полученного на шаге 2.) -
Оценивается предложение
WHERE
внешнего запроса на основе результатов подзапроса, выполненного на шаге 3. Это позволяет определить, будет ли строка-кандидат выбираться в качестве выходных данных. (В примере количество смен сотрудником должностей, оцениваемое подзапросом, сравнивается со значением 2 в оператореWHERE
внешнего запроса. Если условие выполняется, запись сотрудника выводится на экран.) -
Процедура повторяется для следующей строки-кандидата таблицы и так далее до тех пор, пока все строки в таблице не будут обработаны.
Корреляция устанавливается путем использования в подзапросе элемента из внешнего запроса.
В этом примере сравнивается значение EMPLOYEE_ID
из таблицы в подзапросе со значением EMPLOYEE_ID
из таблицы во внешнем запросе.
Далее: Выполнение обычного поиска с использованием условия REGEXP_LIKE