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.
Таблица Users пишет таблице Orders: — Ты забыл про меня. Мы не связаны. Orders: — У тебя нет внешнего ключа ко мне. Users: — Значит, я буду NULL в твоей жизни. DBA: — Это LEFT JOIN, успокойтесь.
Одна таблица говорит другой: — Ты меня не найдёшь, я не по ключу! — А я тебя через CROSS JOIN найду. Ты у меня с каждым своим столбцом перемножишься. — Ты чудовище.