Нужно выбрать заказы, у которых amount выше среднего amount по тому же пользователю. Какой вариант WHERE корректно использует коррелированный подзапрос?

ASELECT * FROM orders o WHERE o.amount > (SELECT AVG(amount) FROM orders)
BSELECT * FROM orders o WHERE o.amount > (SELECT AVG(amount) FROM orders WHERE user_id = 123)
CSELECT * FROM orders o WHERE o.amount > (SELECT AVG(o2.amount) FROM orders o2 WHERE o2.user_id = o.user_id)
DSELECT * FROM orders o WHERE o.user_id IN (SELECT AVG(amount) FROM orders GROUP BY user_id)
Правильный ответ. Коррелированный подзапрос ссылается на колонку внешнего запроса (например, o.user_id), поэтому среднее считается отдельно для каждого пользователя.

Разбор

В варианте с корреляцией условие внутри подзапроса связывает строки таблицы orders (алиас o2) со строкой внешней таблицы orders (алиас o). Так подзапрос вычисляет среднее только по заказам текущего пользователя, а не по всей таблице. Некоррелированный подзапрос посчитает одно глобальное значение и сравнит с ним все строки.

Проверь себя · 1/3разбор после ответа
Нужно выбрать заказы, у которых amount выше среднего amount по тому же пользователю. Какой вариант WHERE корректно использует коррелированный подзапрос?
Тренировать SQL в Telegram

Ещё вопросы по теме «Подзапросы и CTE»