Рубрики

Коррелированные подзапросы SQL

Коррелированные подзапросы используются для построчной обработки. Каждый подзапрос выполняется один раз для каждой строки внешнего запроса.

Коррелированный подзапрос оценивается один раз для каждой строки, обработанной родительским оператором. Родительский оператор может быть оператором SELECT , UPDATE или DELETE .

SELECT column1, column2, ....
FROM table1 outer
WHERE column1 operator
                    (SELECT column1, column2
                     FROM table2
                     WHERE expr1 = 
                               outer.expr2);

Коррелированный подзапрос — это один из способов чтения каждой строки в таблице и сравнения значений в каждой строке со связанными данными. Он используется всякий раз, когда подзапрос должен возвращать разные результаты или наборы результатов для каждой строки-кандидата, рассматриваемой основным запросом. Другими словами, вы можете использовать коррелированный подзапрос, чтобы ответить на вопрос, состоящий из нескольких частей, ответ которого зависит от значения в каждой строке, обработанной родительским оператором.

Вложенные подзапросы и коррелированные подзапросы:

При обычном вложенном подзапросе внутренний запрос SELECT выполняется первым и выполняется один раз, возвращая значения, которые будут использоваться основным запросом. Однако коррелированный подзапрос выполняется один раз для каждой строки-кандидата, рассматриваемой внешним запросом. Другими словами, внутренний запрос управляется внешним запросом.
ПРИМЕЧАНИЕ. Вы также можете использовать операторы ЛЮБОЙ и ВСЕ в коррелированном подзапросе.
ПРИМЕР коррелированных подзапросов: найдите всех сотрудников, которые зарабатывают больше, чем средняя зарплата в их отделе.

SELECT last_name, salary, department_id
 FROM employees outer
 WHERE salary >
                (SELECT AVG(salary)
                 FROM employees
                 WHERE department_id =
                        outer.department_id);

Другое использование корреляции в UPDATE и DELETE

ИСПРАВЛЕННОЕ ОБНОВЛЕНИЕ:

UPDATE table1 alias1
 SET column = (SELECT expression 
               FROM table2 alias2
               WHERE alias1.column =
                     alias2.column);

Используйте коррелированный подзапрос для обновления строк в одной таблице на основе строк из другой таблицы.

ИСПРАВЛЕННОЕ УДАЛЕНИЕ:

DELETE FROM table1 alias1
 WHERE column1 operator
               (SELECT expression
                FROM table2 alias2
                WHERE alias1.column = alias2.column);

Используйте коррелированный подзапрос для удаления строк в одной таблице на основе строк из другой таблицы.

Использование оператора EXISTS:

Оператор EXISTS проверяет наличие строк в наборе результатов подзапроса. Если найдено значение строки подзапроса, условие помечается как ИСТИНА, и поиск не продолжается во внутреннем запросе, а если оно не найдено, то условие помечается как ЛОЖЬ, и поиск продолжается во внутреннем запросе.
ПРИМЕР использования оператора EXIST:
Найдите сотрудников, у которых есть хотя бы один человек, подчиняющийся им.

SELECT employee_id, last_name, job_id, department_id
FROM employees outer
WHERE EXISTS ( SELECT ’X’
FROM employees
WHERE manager_id =
outer.employee_id);

ВЫХОД :

ПРИМЕР использования оператора NOT EXIST:
Найдите все отделы, в которых нет сотрудников.

SELECT department_id, department_name
FROM departments d
WHERE NOT EXISTS (SELECT ’X’
FROM employees
WHERE department_id
= d.department_id);

ВЫХОД :

Рекомендуемые посты:

Коррелированные подзапросы SQL

0.00 (0%) 0 votes