У меня есть вопрос о боковых соединениях в Postgres.
Мой вариант использования: я хочу вернуть набор данных, который объединяет несколько таблиц, но ограничивает количество возвращаемых публикаций и обзоров. Упрощенная схема таблицы ниже
Автор таблицы
- ID
- ИМЯ
Просмотр таблицы
- ID
- AUTHOR_ID
- PUBLICATION_ID
- СОДЕРЖАНИЕ
Публикация таблицы
- ID
- ИМЯ
Таблица AuthorPublication
- AUTHOR_ID
- PUBLICATION_ID
Итак, для моего первоначального запроса у меня есть это:
SELECT
a.id,
a.name
json_agg (
json_build_object (
'id', r.id,
'content', r.content
)
) AS reviews,
json_agg (
json_build_object(
'id', p.id,
'name', p.name
)
) AS publications
FROM
public.author a
INNER JOIN
public.review r ON r.author_id = a.id
INNER JOIN
public.author_publication ap ON ap.author_id = a.id
INNER JOIN
public.publication p ON p.id = ap.publication_id
WHERE
a.id = '1'
GROUP BY
a.id
Это возвращает нужные мне данные, например, я получаю имя автора, идентификатор и список всех его обзоров и публикаций, которым они принадлежат. Что я хочу сделать, так это ограничить количество обзоров и публикаций. Например вернуть 5 отзывов и 3 публикации.
Я пытался сделать это с помощью бокового запроса, но столкнулся с проблемой, когда, если я выполняю один боковой запрос, он работает по назначению.
так как:
INNER JOIN LATERAL
(SELECT r.* FROM public.review r WHERE r.author_id = a.id LIMIT 5) r ON TRUE
Это возвращает набор данных только с 5 отзывами, но если я добавлю второй боковой запрос
INNER JOIN LATERAL
(SELECT ap.* FROM public.author_publication ap WHERE ap.author_id = a.id LIMIT 5) r ON TRUE
Теперь я получаю 25 результатов как для обзоров, так и для публикаций с повторными/дублированными данными.
Итак, мой вопрос: разрешено ли вам иметь несколько боковых соединений в одном запросе PG, и если нет, то как можно ограничить количество результатов из JOIN?
Спасибо!