Postgresql 使用Postgres将两个表中的数据作为数组输出

Postgresql 使用Postgres将两个表中的数据作为数组输出,postgresql,Postgresql,我在Postgres数据库中有两个表,如果可能的话,我需要一些帮助来将查询集合起来以特定格式输出数据 表1账户 RowID Name AccountNo 1 John 45356333 2 Helen 74562445 表2代码 RowID AccountNo Code Status 1 45356333 csdcwew Active 2 45356333

我在Postgres数据库中有两个表,如果可能的话,我需要一些帮助来将查询集合起来以特定格式输出数据

表1账户

RowID    Name    AccountNo
1        John    45356333
2        Helen   74562445
表2代码

RowID     AccountNo    Code         Status
1         45356333     csdcwew      Active
2         45356333     gererge      Active
2         74562445     thwfewf      Active
我希望能够获得数据,以便最终获得一个JSON对象,如下所示:

{
  "Accounts": [
    {
      "AccountNo": "45356333",
      "Codes": [
        {
          "Code": "csdcwew",
          "Status": "Active"
        },
        {
          "Code": "gererge",
          "Status": "Active"
        }
      ]
    },
    {
      "AccountNo": "74562445",
      "Codes": [
        {
          "Code": "thwfewf",
          "Status": "Active"
        }
      ]
    }
  ]
}
我尝试过一个查询,它使用array_agg函数输出所有帐户和一个代码数组,但这是我所能得到的。真的,我也需要状态和描述

 SELECT a."Name",
    array_agg(c."Codes")
   FROM ("Accounts" a
     LEFT JOIN "Codes" c ON ((c."AccountNo" = a."AccountNo")))
  GROUP BY a."Name";

你很接近。您可以继续使用聚合状态值的方式,就像聚合代码的方式一样。然后,您将有两个列,可以按顺序进行迭代

另一种选择是Postgres有一个非常合理的JSON语法,允许您直接聚合到JSON

SELECT json_agg(json_build_object(
    'AccountNo', accountNo,
    'Codes', val ))
FROM (
    select accountNo,
        json_agg (json_build_object(
            'code', code, 
            'status', status))  as val 
        from codes
        group by accountNo) as c;

通过对表名的引号进行一些调整,这是可行的。如果我需要从Accounts表中获取更多数据,我没有透露那里还有其他字段我想包含在结果中,这真的是我的错。抱歉。从account表中获取更多细节应该不是问题。您可以执行与在c上的问题中相同的联接,然后在调用外部json_build_对象时包括它们。