postgresql - Postgres 横向连接多个表以限制结果

标签 postgresql join lateral

我对 Postgres 中的横向连接有疑问。

我的用例是我想返回一个组合多个表但限制返回的出版物和评论数量的数据集。简化的表架构如下

表格作者

  • 身份证
  • 姓名

表格审核

  • 身份证
  • AUTHOR_ID
  • PUBLICATION_ID
  • 内容

表格发布

  • 身份证
  • 姓名

表作者发布

  • 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

这会返回我需要的数据,例如我得到作者的姓名、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 结果数量的好方法是什么?

谢谢!

最佳答案

您必须将查询更改为如下所示:

SELECT
  a.id,
  a.name,
  (
    SELECT
        json_agg ( r )
      FROM (
             SELECT 
                  json_build_object (
                      'id', r.id,
                      'content', r.content 
                  ) AS r
               FROM public.review r 
              WHERE r.author_id = a.id
              ORDER BY r.id
              LIMIT 5
           ) AS a
  ) AS reviews,
  (
   SELECT
        json_agg (p)
     FROM (
            SELECT
                 json_build_object(
                    'id', p.id, 
                     'name', p.name
                 ) AS p
              FROM public.author_publication ap 
             INNER JOIN public.publication p ON p.id = ap.publication_id
             WHERE ap.author_id = a.id
             ORDER BY p.id
             LIMIT 3
        ) AS a
   ) AS publications
FROM
  public.author a
WHERE 
  a.id = '1'

关于postgresql - Postgres 横向连接多个表以限制结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42194314/

相关文章:

sql - 如何合并(合并)相似的列以通过 JOIN 删除 NULL

sql - 导致 PostgreSQL 9.3 语法错误的代码有什么问题

hadoop - 我可以在Hive中进行LEFT JOIN LATERAL吗?

sql - 与表中定义的多个范围相匹配的列的子查询

sql - postgres 约束排除 : no performance gain

java - JPA 查询连接表

postgresql - 是否可以将 firebase 云 firestore 数据导出到 postgresql?

php - 将数据插入交集表

bash - 如何在 .pgpass 文件中输入多个条目?

java - JDBC ResultSet 对象类型映射有没有 Byte 或 Short?为什么只能是整数?