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;Связанные термины
Анекдоты по теме
— Мой JOIN работает уже 40 минут. — Сколько строк в таблицах? — По миллиону. — Индекс есть? — Нет. — Ну и жди ещё 40.
Приходит JOIN к врачу: — Доктор, я перемножаю таблицы, и у меня из 1000 строк стало 1000000. Врач: — Ты забыл условие. Это CROSS JOIN. Оно неизлечимо.
— Какая разница между INNER JOIN и дружбой? — INNER JOIN рвётся, если нет совпадений. А дружба — LEFT JOIN. Даже когда вы не совпадаете, ты всё равно остаёшься в таблице.