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 子句。这就是错误消息所说的:

demo:db<>fiddle

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 部分放入子查询并最后加入不相关的表。