Коррелированные подзапросы
Все предыдущие рассматриваемые подзапросы были некоррелированные (независимые). Они могли выполняться автономно от основного запроса и мы могли посмотреть, что они возвращают перед тем, как их результат будет использоваться в основном запросе. Коррелированные же подзапросы ссылаются на один или несколько столбцов основного запроса.
Пример коррелированного подзапроса
Например, следующий коррелируемый подзапрос находит кто и сколько потратил:
SELECT FamilyMembers.member_name, ( SELECT SUM(Payments.unit_price * Payments.amount) FROM Payments WHERE Payments.family_member = FamilyMembers.member_id ) AS total_spent FROM FamilyMembers;
В данном случае, коррелированный подзапрос ссылается к столбцу member_id из основного запроса.
Коррелированный подзапрос отличается от некоррелированного подзапроса тем, что он выполняется не один раз перед выполнением запроса, в который он вложен, а для каждой строки, которая может быть включена в окончательный результат.
Так в нашем случае основной запрос к таблице FamilyMembers возвращает 8 записей и для каждой из них выполняется коррелированный подзапрос.
Влияние на производительность
Следует обратить внимание на то, что использование коррелированных подзапросов может вызвать проблемы с производительностью, особенно если содержащий запрос возвращает много строк, так как коррелированный подзапрос будет выполняться для каждой строки содержащего запроса отдельно.