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, а строк стало больше, чем было! Опытный: — Поздравляю. Ты сделал CROSS JOIN. Забыл ON.
— Почему новички боятся JOIN? — Потому что боятся, что таблицы «перемножатся» и получатся миллионы строк. Правильно боятся. Без правильного условия так и будет.
Подзапрос говорит JOIN: — Я тоже могу соединять таблицы! JOIN: — Но я делаю это один раз. Подзапрос: — Зато я более читаем! OPTIMIZER: — На самом деле я часто превращаю подзапросы в JOIN сам.