PostgreSQL JSONB |嵌套数组给出错误聚合函数调用不能嵌套
Postgresql JSONB | nested arrays gives ERROR aggregate function calls cannot be nested
所以我试图对多个查询进行卷积并将结果形成为
[
{
heading: 'Test',
subheading: 'SubTest',
pItems: [
{
pid: 1,
product_name: 'Random Product',
stock: 500
},
{
pid: 1,
product_name: 'Random Product',
stock: 500
}
]
},
{
heading: 'Test 2',
subheading: 'SubTest 2',
pItems: [
{
pid: 1,
product_name: 'Random Product 2',
stock: 500
},
{
pid: 1,
product_name: 'Random Product 2',
stock: 500
}
]
}
]
这是我试过的
https://dbfiddle.uk/?rdbms=postgres_10&fiddle=af81919b853b571ca2f25c96abbad596
但是我收到了这个错误
ERROR: aggregate function calls cannot be nested
您有两个 json_agg()
电话。这个函数是一个聚合函数。对于每个嵌套聚合,您需要一个单独的 GROUP BY
子句。这就是错误消息所说的:
SELECT
*
FROM (
SELECT
test, client_id, project_id,
json_build_object (
'myData_updated',
json_agg(p_items)
)
FROM (
SELECT
test, client_id, project_id,
jsonb_build_object(
'heading', heading_elems -> 'heading',
'subheading', heading_elems -> 'subheading',
'pItems', json_agg(elems || jsonb_build_object('product_name', po.name))
) AS p_items
FROM mainTable mt CROSS JOIN LATERAL
jsonb_array_elements(mt.myData) AS heading_elems CROSS JOIN LATERAL
jsonb_array_elements(heading_elems -> 'pItems') AS elems
JOIN products po ON (elems ->> 'pid' )::int = po.pid
GROUP BY test, client_id, project_id, heading_elems
) s
GROUP BY test, client_id, project_id
) s
INNER JOIN clients client ON client.client_id = s.client_id
INNER JOIN projects project on project.project_id = s.project_id
此外,我会避免混淆 JSON 部分并加入您案例中的所有其他表。这就是为什么我将 JSON 部分放入子查询并最后加入不相关的表。
所以我试图对多个查询进行卷积并将结果形成为
[
{
heading: 'Test',
subheading: 'SubTest',
pItems: [
{
pid: 1,
product_name: 'Random Product',
stock: 500
},
{
pid: 1,
product_name: 'Random Product',
stock: 500
}
]
},
{
heading: 'Test 2',
subheading: 'SubTest 2',
pItems: [
{
pid: 1,
product_name: 'Random Product 2',
stock: 500
},
{
pid: 1,
product_name: 'Random Product 2',
stock: 500
}
]
}
]
这是我试过的
https://dbfiddle.uk/?rdbms=postgres_10&fiddle=af81919b853b571ca2f25c96abbad596
但是我收到了这个错误
ERROR: aggregate function calls cannot be nested
您有两个 json_agg()
电话。这个函数是一个聚合函数。对于每个嵌套聚合,您需要一个单独的 GROUP BY
子句。这就是错误消息所说的:
SELECT
*
FROM (
SELECT
test, client_id, project_id,
json_build_object (
'myData_updated',
json_agg(p_items)
)
FROM (
SELECT
test, client_id, project_id,
jsonb_build_object(
'heading', heading_elems -> 'heading',
'subheading', heading_elems -> 'subheading',
'pItems', json_agg(elems || jsonb_build_object('product_name', po.name))
) AS p_items
FROM mainTable mt CROSS JOIN LATERAL
jsonb_array_elements(mt.myData) AS heading_elems CROSS JOIN LATERAL
jsonb_array_elements(heading_elems -> 'pItems') AS elems
JOIN products po ON (elems ->> 'pid' )::int = po.pid
GROUP BY test, client_id, project_id, heading_elems
) s
GROUP BY test, client_id, project_id
) s
INNER JOIN clients client ON client.client_id = s.client_id
INNER JOIN projects project on project.project_id = s.project_id
此外,我会避免混淆 JSON 部分并加入您案例中的所有其他表。这就是为什么我将 JSON 部分放入子查询并最后加入不相关的表。