【问题标题】:Nesting json_agg() inside json_agg()postgresql json_agg 内幕 json_agg
【发布时间】:2021-04-08 19:58:58
【问题描述】:

你好,我是 postgre(和一般的 sql)的新手

我有这 2 个表任务和带有这些列的子任务

Tasks
id
name
description
Subtasks
id
name
description
task_id

我正在尝试执行一个会输出类似这样的查询

[
{
id:30,
name:"Do something",
description:"Do this",
  sub_task:[
    {id:1,name:"test",description:"test"}
  ]
}
]

经过一些研究,我发现了如何以 json 格式查询数据,如果我没有嵌套的东西,它就可以工作,而且我不知道该怎么做。 这是我尝试过的

let query =
      "SELECT t.id, json_agg(json_build_object('name',t.name,'description',t.description,'id',t.id,'subtask',json_agg(json_builder_object('name',s.name,'description',s.description)))) as test from task t ";
    query += " inner join subtask s on s.task_id = t.id ";

我试图做这个嵌套的 json_agg 但它不工作我得到这个错误

json_builder_object(unknown, character varying, unknown, text) does not exist

我该怎么做?

【问题讨论】:

    标签: sql node.js postgresql


    【解决方案1】:

    嗯,是json_build_object(),而不是json_builder_object()

    但主要问题是您不能嵌套聚合函数。为此,您需要一个子查询或 CTE。喜欢:

    SELECT json_agg(json_build_object('id',t.id, 'name',t.name, 'description',t.description, 'subtask',s.sub_task)) AS task
    FROM   tasks t
    CROSS  JOIN LATERAL (
       SELECT json_agg(json_build_object('id',s.id, 'name',s.name, 'description',s.description)) AS sub_task
       FROM   subtasks s
       WHERE  task_id = t.id
       ) s;
    

    或等价物:

    SELECT json_agg(t) AS tasks
    FROM  (
       SELECT *
       FROM   tasks t
       CROSS  JOIN LATERAL (
          SELECT json_agg(sub_task) AS sub_task
          FROM  (
             SELECT id, name, description
             FROM   subtasks
             WHERE  task_id = t.id
             ) sub_task
          ) s
       ) t;
    

    相关:

    【讨论】:

    猜你喜欢
    • 2014-08-01
    • 1970-01-01
    • 2017-09-13
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    • 2018-01-09
    相关资源
    最近更新 更多