Запрос: SELECT u.name, last_order.* FROM users u, (SELECT * FROM orders WHERE user_id = u.id ORDER BY created_at DESC LIMIT 1) last_order. Заметьте: LATERAL не указан. Что произойдёт?

AЗапрос выполнится: подзапрос в FROM видит таблицы внешнего блока без ключевого слова LATERAL
BОшибка выполнения: без LATERAL подзапрос в FROM не может ссылаться на колонку u.id из соседней таблицы
CЗапрос выполнится, но WHERE user_id = u.id будет проигнорирован, и подзапрос вернёт один заказ для всех
DЗапрос выполнится с декартовым произведением: по LIMIT 1 строке на каждого u через перебор сочетаний
Правильный ответ. Без ключевого слова LATERAL подзапрос в FROM не видит другие таблицы того же FROM, поэтому ссылка u.id приведёт к ошибке.

Разбор

В стандартном SQL подзапрос в FROM (derived table) изолирован от внешнего контекста: ссылка u.id внутри него вызывает ошибку вроде invalid reference to FROM-clause entry for table u. Чтобы разрешить корреляцию, нужно явно написать FROM users u, LATERAL (SELECT ... WHERE user_id = u.id ...) last_order. Только LATERAL декларирует, что подзапрос вычисляется для каждой строки внешней таблицы. Идея «подзапрос проигнорирует условие» или «вернёт декартово произведение» неверна — парсер просто откажет в исполнении.

Проверь себя · 1/3разбор после ответа
У вас есть два набора пользователей одного типа: new_users_ru(user_id) и new_users_kz(user_id). Нужно получить общий список пользователей для дальнейшего соединения с orders. Что сделать на первом шаге?
Тренировать SQL в Telegram

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