PostgreSQL LATERAL: получить последнюю дочернюю запись

Категория: Postgresql · Язык: SQL · Обновлено:

LATERAL позволяет подзапросу использовать поля строки слева от JOIN. В сочетании с ORDER BY и LIMIT 1 это выбирает последнюю связанную запись отдельно для каждого родителя. ??????? ????????? ?????? ?? ????????? ??????? ? ??????? ???? ?????????? ?? ????? ??????.

Рабочий пример

SQL
WITH users(id) AS (VALUES (1), (2)),
     events(user_id, created_at, note) AS (
       VALUES (1, timestamp '2026-10-01', 'first'),
              (1, timestamp '2026-10-02', 'latest'),
              (2, timestamp '2026-10-01', 'only')
     )
SELECT users.id, latest.note
FROM users
LEFT JOIN LATERAL (
  SELECT note FROM events
  WHERE events.user_id = users.id
  ORDER BY created_at DESC LIMIT 1
) AS latest ON true;

LEFT JOIN сохраняет родителей без дочерних событий и возвращает NULL в выбранных колонках. Для больших таблиц создайте индекс по (user_id, created_at DESC).

Частый вопрос

Зачем здесь слово LATERAL?

Оно разрешает подзапросу справа ссылаться на users.id из текущей строки слева. Без LATERAL такая корреляция в FROM не разрешается.