JOINПродвинутый
LATERAL JOIN
Подзапрос в FROM, который может ссылаться на колонки из предыдущих таблиц того же FROM.
Синтаксис
SELECT ... FROM t1, LATERAL (SELECT ... WHERE fk = t1.id LIMIT n) sub;
Объяснение
LATERAL позволяет правой части JOIN обращаться к текущей строке левой части. Это невозможно в обычном JOIN.
Классический пример: для каждого пользователя получить его последние N заказов.
Пример
-- Последние 3 заказа каждого пользователя SELECT u.name, o.id, o.total FROM users u, LATERAL ( SELECT id, total FROM orders WHERE user_id = u.id ORDER BY created_at DESC LIMIT 3 ) o;
Связанные термины
Анекдоты по теме
— Что такое N+1 проблема? — Загрузил список из 100 пользователей — 1 запрос. Потом для каждого загрузил заказы — 100 запросов. Итого 101 запрос вместо 1 с JOIN. — Как исправить? — prefetch_related / eager loading / JOIN.
Одна таблица говорит другой: — Ты меня не найдёшь, я не по ключу! — А я тебя через CROSS JOIN найду. Ты у меня с каждым своим столбцом перемножишься. — Ты чудовище.
— Как называется операция, которая соединяет две таблицы без условия? — Брак. Потому что последствия непредсказуемы, а количество строк растёт экспоненциально.