PostgreSQL:json_agg in 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

对于我的问题,我在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', 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
,结果是
[[..]]
。我希望输出为
[…]
无问题。:)