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;
Связанные термины
Анекдоты по теме
Оптимизатор запросов видит запрос с 7 JOIN. Оптимизатор: интересно. Оптимизатор перебирает 5040 возможных порядков соединения. Оптимизатор: выбираю лучший. Разработчик: почему запрос планируется 2 секунды? Оптимизатор: ты написал 7 JOIN.
— Как называется операция, которая соединяет две таблицы без условия? — Брак. Потому что последствия непредсказуемы, а количество строк растёт экспоненциально.
Таблица Users пишет таблице Orders: — Ты забыл про меня. Мы не связаны. Orders: — У тебя нет внешнего ключа ко мне. Users: — Значит, я буду NULL в твоей жизни. DBA: — Это LEFT JOIN, успокойтесь.