合并两个连接的表并输出为JSON?

合并两个连接的表并输出为JSON?,json,postgresql,jsonb,pg,Json,Postgresql,Jsonb,Pg,我想选择实体和一个上传JSON数组列,其中包含所有上传内容,以及每次上传的封面和配置文件字段 到目前为止,我可以获得上传的数组,但是我无法从entitiesXuploads表中添加另外两个字段 我的三个表的基本表示如下所示: 实体 id(int8) 名称(varchar) 上传 id(uuid) 标题(varchar) 版本(jsonb) entitiesXuploads entityId(int8) 上传ID(uuid) 封面(bool) 个人资料(bool) 我的问题是: SEL

我想
选择
实体和一个
上传
JSON数组列,其中包含所有上传内容,以及每次上传的
封面
配置文件
字段

到目前为止,我可以获得上传的数组,但是我无法从
entitiesXuploads
表中添加另外两个字段

我的三个表的基本表示如下所示:

实体

  • id(int8)
  • 名称(varchar)
上传

  • id(uuid)
  • 标题(varchar)
  • 版本(jsonb)
entitiesXuploads

  • entityId(int8)
  • 上传ID(uuid)
  • 封面(bool)
  • 个人资料(bool)
我的问题是:

SELECT
    e.id,
    e.name,
    COALESCE(jsonb_agg(up) FILTER (WHERE up."id" IS NOT NULL), '[]') as uploads

FROM 
    entities as e
    LEFT JOIN "entitiesXuploads" as exu ON exu."entityId" = e."id"
    LEFT JOIN "uploads" as up ON up."id" = exu."uploadId"

GROUP BY
    e.id,
    e.name
返回包含以下内容的行:

  • id(实体id)
  • 名称(实体名称)
  • 上传(上传的json数组)


您可以使用
jsonb\u build\u object()
为每条记录创建所需的对象。之后,您可以使用
jsonb_agg()
aggregate函数对记录进行分组,以将这些对象合并到一个数组中。

Perfect,我在您的
jsonb_agg
函数周围添加了COALESCE,以便在找不到id时具有空的
[]
。很好!如果没有id,则联接不会添加记录。所以这是没有理由的。如果您真的需要像示例中那样的左连接,那么您将需要类似的东西。必须保留左连接,并且有时还意识到它在
上传
数组中给了我重复的项,因此我在
jsonb_build_对象
函数前面添加了
DISTINCT
,现在一切都好了:)
SELECT 
    e.id,
    e.name,
    jsonb_agg(
        jsonb_build_object(
            'upload_id', upload_id, 
            'title', title, 
            'versions', versions,
            'cover', cover,
            'profile', profile
        )
    ) AS uploads
FROM
    entities e
JOIN entities_uploads eu ON e.id = eu.entity_id
JOIN uploads u ON eu.upload_id = u.id
GROUP BY e.id, e.name