合并两个连接的表并输出为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