【问题标题】:Postgres how to nest multiple json_agg subqueriesPostgres如何嵌套多个json_agg子查询
【发布时间】:2021-05-22 20:24:02
【问题描述】:

我目前有以下 postgres 查询。使用一个聚合子查询。我不是经验丰富的开发人员,如果我没有很好地解释这一点,我深表歉意。

select row_to_json(x)
from (
    select  i.intel_id,
            i.created_date,
            i.title,
            (select json_agg(adv) from (select c.company_name, 
                                      cr.company_role_name,
                                      (select json_agg(ppl) from (select  p.person_first_name||' '||p.person_last_name AS person,
                                                                          iprt.person_role_name,
                                                                          p.person_linkedin)ppl )as people
                                     
                                      from intel.intel_company_role icr 
                                      join intel.intel_person_company_role ipcr on ipcr.company_id = icr.company_id
                                      join entities.companies c on c.company_id = ipcr.company_id
                                      join intel.company_roles cr on cr.company_role_id = icr.company_role_id
                                      join entities.person p on p.person_id = ipcr.person_id
                                      join intel.intel_person_role_type iprt on iprt.person_role_id = ipcr.person_role_id
                                      where intel_id = i.intel_id  and icr.company_role_id in(1,2))adv)
            as advisors
            from intel.intel i
)x;

它产生以下输出

{
  "intel_id": 1,
  "created_date": "2021-02-14T01:16:11.403117",
  "title": "This is an article headline  CompanyA expands brands in acquisition",
  "advisors": [
    {
      "company_name": "CompanyName 1",
      "company_role_name": "Legal Advisor",
      "people": [
        {
          "person": "Brad Blunder",
          "person_role_name": "Partner",
          "person_linkedin": "https://linkedin.com/brad_blunder"
        }
      ]
    },
    {
      "company_name": "CompanyName 1",
      "company_role_name": "Legal Advisor",
      "people": [
        {
          "person": "Jane Summers",
          "person_role_name": "Partner",
          "person_linkedin": "https://linkedin.com/jane_summers"
        }
      ]
    },
    {
      "company_name": "CompanyName 2",
      "company_role_name": "Financial Advisor",
      "people": [
        {
          "person": "Greg Gander",
          "person_role_name": "Leader",
          "person_linkedin": "https://linkedin.com/greg_gander"
        }
      ]
    },
    {
      "company_name": "CompanyName 2",
      "company_role_name": "Financial Advisor",
      "people": [
        {
          "person": "Helen Hodges",
          "person_role_name": "Leader",
          "person_linkedin": "https://linkedin.com/helen_hodges"
        }
      ]
    }
  ]
}

我正在尝试嵌套第二个聚合子查询,以便它生成以下 json 输出 每个人都聚集到一个公司。

{
  "id": 1,
  "date": "2021-02-14T01:16:11.403117",
  "title": "This is an article headline  CompanyA expands brands in acquisition",
  "author": "Joe Bloggs",
  "text": "This is the full html article text here",
  "advisors": [
    {
        "company_name": "CompanyName 1",
        "company_role": "legal",
        "side": "to the target",
        "people": [
            {
                "name": "Brad Blunder",
                "person_role": "partner",
                "linkedin": "https://linkedin.com/brad_blunder"
            },
            {
                "name": "Jane Summers",
                "person_role": "partner",
                "linkedin": "https://linkedin.com/jane_summers"            
            }
        ]
    },
    {
        "company_name": "CompanyName 2",
        "company_role": "accountancy",
        "side": "to the seller",
        "people": [
            {
                "name": "Greg Gander",
                "person_role": "partner",
                "linkedin": "https://linkedin.com/greg_gander"
            },
            {
                "name": "Helen Hodges",
                "person_role": "partner",
                "linkedin": "https://linkedin.com/helen_hodges"            
            }
        ]
    }
    
   ]
}

感谢任何可以帮助新手在这里做正确事情的人,非常感谢

【问题讨论】:

  • 我已经设法解决了这个问题,一旦我明白了 json_agg 在子查询中使用时的实际作用,这真的很简单

标签: json postgresql aggregate-functions


【解决方案1】:

可能有一种更简洁的方式来写这个,如果有人想改进它,请按照我渴望学习的方式去做

select row_to_json(outerq)--::jsonb
from (
        select  i.intel_id,
                i.created_date,
                i.title,
                a.first_name||' '||a.last_name as author,
                (select json_agg(subqadv) from (select  
                                                        c1.company_name, 
                                                        cr.company_role_name,
                                                        tst.transaction_side_type_name,
                                                        (select json_agg(subqp) from (select            
                                                                                                    p.person_first_name||' '||p.person_last_name as person,
                                                                                                    iprt.person_role_name,
                                                                                                    p.person_linkedin
                                                                                                    from entities.person p
                                                                                                    join intel.intel_person_company_role ipcr on ipcr.person_id = p.person_id
                                                                                                    join intel.intel_person_role_type iprt on iprt.person_role_id = ipcr.person_role_id
                                                                                                    where ipcr.company_id = c1.company_id                                           
                                                        )subqp) as people

                                                        from intel.intel_company_role icr1 
                                                        join intel.transaction_side_types tst on tst.transaction_side_type_id = icr1.transaction_side_type_id
                                                        join entities.companies c1 on c1.company_id = icr1.company_id
                                                        join intel.company_roles cr on cr.company_role_id = icr1.company_role_id
                                                        where  icr1.company_role_id in(1,2))
                 subqadv) as advisors,
    
                (select json_agg(subqfin) from (select 
                                                        f.reported_year,
                                                        f.turnover,
                                                        f.gross_profit,
                                                        f.num_employees
                                                        from intel.intel_financials f)
                subqfin ) as financials
                --------------------
                from intel.intel i
                join intel.authors a on a.author_id = i.author_id
    )outerq;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    相关资源
    最近更新 更多