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


В запросе к базе данных SQL коррелированный подзапрос ( также известный как синхронизированный подзапрос ) — это подзапрос (запрос, вложенный в другой запрос), который использует значения из внешнего запроса. Поскольку подзапрос может выполняться один раз для каждой строки, обрабатываемой внешним запросом, это может быть медленным.

Вот пример типичного коррелированного подзапроса. В этом примере цель состоит в том, чтобы найти всех сотрудников, чья зарплата выше средней по их отделу.

В приведенном выше вложенном запросе внутренний запрос должен выполняться повторно для каждого сотрудника. (Достаточно умная реализация может кэшировать результат внутреннего запроса для каждого отдела отдельно, но даже в лучшем случае внутренний запрос должен выполняться один раз для каждого отдела.)

Коррелированные подзапросы могут появляться в другом месте, помимо предложения WHERE ; например, этот запрос использует коррелированный подзапрос в предложении SELECT для вывода всего списка сотрудников вместе со средней зарплатой для каждого отдела сотрудника. Опять же, поскольку подзапрос коррелирует со столбцом внешнего запроса, его необходимо повторно выполнять для каждой строки результата. [ нужна ссылка ]

Как правило, бессмысленно иметь коррелированный подзапрос в предложении FROM, потому что таблица в предложении FROM необходима для оценки внешнего запроса, но коррелированный подзапрос в предложении FROM не может быть оценен до того, как будет оценен внешний запрос, что приведет к ошибке. проблема курицы и яйца . В частности, MariaDB указывает это как ограничение в своей документации. [1]

Однако в некоторых системах баз данных разрешено использовать коррелированные подзапросы при объединении в предложении FROM, ссылаясь на таблицы, перечисленные перед объединением, используя указанное ключевое слово, создавая ряд строк в коррелированном подзапросе и присоединяя его к таблице на слева. Например, в PostgreSQL добавление ключевого слова LATERAL перед правым подзапросом [2] или в Microsoft SQL Server использование ключевого слова CROSS APPLY или OUTER APPLY вместо JOIN [3] приводит к эффекту.