【问题标题】:Postgresql JSONB | nested arrays gives ERROR aggregate function calls cannot be nestedPostgreSQL JSONB |嵌套数组给出 ERROR 聚合函数调用不能嵌套
【发布时间】:2019-12-22 12:48:47
【问题描述】:

所以我试图卷积多个查询并将结果形成为

[

    {
        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

但是我收到了这个错误

错误:聚合函数调用不能嵌套

【问题讨论】:

    标签: node.js postgresql aggregate-functions psql pg


    【解决方案1】:

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

    【讨论】:

    • 您的代码没有考虑多个 pItems 检查您的输出它在 pItems 中只有一个项目
    • 是的,当然。您的示例只有一种产品。那么如果产品 2 不存在,pid = 2 应该采取什么措施?在这里,我添加了第二个产品,它可以工作:dbfiddle.uk/…
    • 哦,我的错。我忘记了不存在的参考。再次感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    • 1970-01-01
    相关资源
    最近更新 更多