Нужно для каждого пользователя достать 3 последних заказа. Запрос: SELECT u.name, o.* FROM users u, LATERAL (SELECT * FROM orders WHERE user_id = u.id ORDER BY created_at DESC LIMIT 3) o. Что делает LATERAL?

AОбычный подзапрос в FROM уже умеет ссылаться на столбцы внешнего FROM, поэтому LATERAL здесь не требуется
BКлючевое слово LATERAL применяется к JOIN ON и добавляет дополнительные условия соединения для строк правой таблицы
CПодзапрос с LATERAL может ссылаться на столбцы таблиц, указанных левее в том же FROM — здесь u.id из users
DКлючевое слово LATERAL автоматически превращает LEFT JOIN во внутреннее соединение, исключая строки без совпадений
Правильный ответ. LATERAL позволяет подзапросу в FROM ссылаться на столбцы из таблиц, перечисленных левее.

Разбор

Без LATERAL подзапрос в FROM изолирован и не может ссылаться на другие таблицы того же FROM. LATERAL снимает это ограничение: подзапрос выполняется для каждой строки левой таблицы, имея доступ к её столбцам. Это аналог коррелированного подзапроса, но в позиции FROM, что позволяет возвращать несколько строк и столбцов. Паттерн «top-N per group» через LATERAL часто эффективнее оконных функций.

Проверь себя · 1/3разбор после ответа
Вы объединяете логи событий из двух источников events_web и events_app, чтобы посчитать количество событий. Важно не потерять повторяющиеся события (например, два одинаковых клика). Что лучше использовать для объединения?
Тренировать SQL в Telegram

Ещё вопросы по теме «JOIN и операции множеств»