PostgreSQL:json_agg in join在嵌套数组中产生结果
对于我的问题,我在join中使用了PostgreSQL:json_agg in join在嵌套数组中产生结果,sql,postgresql,join,aggregate-functions,Sql,Postgresql,Join,Aggregate Functions,对于我的问题,我在join中使用了json\u agg来聚合结果。 但这会导致嵌套数组序列 查询: SELECT c.*, json_agg(ci.national_id) AS national_id, json_agg(a.address) AS address FROM company AS c LEFT JOIN (SELECT company_id, json_agg(json_build_object('value', natio
json\u agg
来聚合结果。
但这会导致嵌套数组序列
查询:
SELECT c.*,
json_agg(ci.national_id) AS national_id,
json_agg(a.address) AS address
FROM company AS c
LEFT JOIN
(SELECT company_id,
json_agg(json_build_object('value', national_id, 'country', country_code)) AS national_id
FROM company_identification
GROUP BY company_id) AS ci ON ci.company_id = c.id
LEFT JOIN
(SELECT company_id,
json_agg(address.*) AS address
FROM address
GROUP BY company_id) AS a ON a.company_id = c.id
GROUP BY c.id
结果:
[
{
"id": "c876967d-dd8b-4068-88f4-57a438a2015c",
"name": "S.A.1",
"nationalId": [
[
{
"value": "string",
"country": "CL"
}
]
],
"address": [
[
{
"id": "d1362084-e652-4900-ba51-86352b7a8ce5",
"streetName": "First Avenue"
},
{
"id": "0f785a23-6eb3-44ea-9254-34a6f47ff638",
"streetName": "Second Avenue"
}
]
]
},
{
"id": "38557302-a6a3-4484-ae1b-27edc8c4e906",
"name": "S.A.",
"nationalId": [
[
{
"value": "Chile",
"country": "CL"
},
{
"value": "Colombia",
"country": "CO"
},
{
"value": "Mexico",
"country": "MX"
}
]
],
"address": [
[
{
"id": "d1362084-e652-4900-ba51-86352b7a8ce5",
"streetName": "First Avenue"
},
{
"id": "0f785a23-6eb3-44ea-9254-34a6f47ff638",
"streetName": "Second Avenue"
}
]
]
}
]
正如您所看到的,national
和address
文件包含嵌套数组
sqlfiddle:
SQLFIDLE的输出:
| id | name | national_id |
|----|-------|-----------------------------------------------|
| 1 | S.A.1 | [[{"value" : "Chile", "country" : "CL "}]] |
| 2 | S.A. | [[{"value" : "Colombia", "country" : "CO "}]] |
national_id字段不应包含数组中的数组
[[ ... ]]
期望输出:
| id | name | national_id |
|----|-------|-----------------------------------------------|
| 1 | S.A.1 | [{"value" : "Chile", "country" : "CL "}] |
| 2 | S.A. | [{"value" : "Colombia", "country" : "CO "}] |
感谢您将示例发布到SQLFiddle。我认为您使用双数组的原因是您在外部的
SELECT
中使用JSON\u AGG
环绕national\u id
。尝试将其和分组按删除
:
SELECT
"c".*,
-- JSON_AGG(ci.national_id) AS national_id
ci.national_id
FROM "company" AS "c"
LEFT JOIN(
SELECT "company_id",
JSON_AGG(
JSON_BUILD_OBJECT(
'value', national_id,
'country', country_code
)
) AS national_id
FROM "company_identification"
GROUP BY "company_id"
) AS "ci" ON "ci"."company_id" = "c"."id"
LEFT JOIN(
SELECT "company_id",
JSON_AGG(address.*) AS address
FROM "address"
GROUP BY "company_id"
) AS "a" ON "a"."company_id" = "c"."id"
-- GROUP BY "c"."id", "c"."name"
;
您已经为国家id
和地址
在两个左连接中执行了JSON\u AGG
,并且它们都是按公司id
分组的,因此在您的外部选择中不需要额外的JSON\u AGG
让我知道这是否有效
您没有明确说明查询应该返回什么。使用足够的单词、句子和引用部分例子,清楚、完整地说出你的意思。请在代码问题中给出一个--cut&paste&runnable代码;示例输入(作为表格初始化代码),具有预期和实际输出(包括逐字错误消息);标签和版本;清晰的说明和解释。这包括您能给出的最少代码,即您显示为OK的代码,由您显示为not OK的代码扩展。(调试基础。)您使用的JSON_AGG
函数将始终以数组形式返回值。您是否可以使用一些示例行更新您的问题,说明您希望如何查看返回的数据?另外,如果您可以发布一个带有DDL
的SQL文件和示例数据,我们将更容易帮助您。这里有一个我开始的,你可以修改的-嗨@ravioli,谢谢你的输入。我已经更新了您的url并添加了所需的输出。因为我使用了两次JSON\u AGG
,结果是[[..]]
。我希望输出为[…]
无问题。:)