【问题标题】:SQL Subquery insert results into jsonSQL 子查询将结果插入 json
【发布时间】:2020-05-20 16:46:44
【问题描述】:

`我正在尝试将子查询的值返回到 json_build_object 中,子查询返回正确的值,但是运行完整选择时结果不正确。值得注意的是,全选是视图的左连接。

        SELECT r.id, sum(q.total) AS overall_total,
        jsonb_agg(json_build_object('count', q.total, 'type', der.name)) AS totals
        FROM test.table_a p
            JOIN test.table_b r
            ON p.root_id = r.id
                inner join (
                    select r.id,  de.value_id as error_type, count(de.value_id) as total
                    from test.table_c de
                    inner join tests.error dr on de.value_id = dr.id
                    inner join test.table_a p on de.process = p.id
                    inner join test.table_b r on p.root = r.id
                    group by r.id, de.value_id 
            ) q on q.id = r.id
         inner join test.table_c er on er.process = p.id
         inner join tests.error der on er.value_id = der.id
    GROUP BY r.id) er on er.id = rs.id

子查询返回 -

由于我试图根据 ID 计算 value_id 的出现次数,我相信我得到了正确的信息。

完整的查询结果和所需的输出 -

我想返回给定 ID 和 json 对象数组的总错误,每个对象内部是类型(value_id 文本表示)和该类型有多少的计数。

当前查询返回错误的overall_total,并且似乎复制了数组中的类型。我哪里做错了?

【问题讨论】:

    标签: sql postgresql jsonb


    【解决方案1】:

    我认为您不需要table_b,请尝试以下查询:

    SELECT q.id, SUM(q.total) AS overall_total,
           JSONB_AGG(JSONB_BUILD_OBJECT('count', q.total, 'type', q.name)) AS totals
      FROM (
            SELECT a.root_id AS id, e.name, COUNT(c.value_id) AS total
              FROM table_c c
              JOIN error e
                ON e.id = c.value_id
              JOIN table_a a 
                ON c.process = a.id  
             GROUP BY e.name, a.root_id  ) q
     GROUP BY q.id
    

    Demo

    【讨论】:

    • 这非常有效!正如我在帖子中所说,这个子查询是更大视图的一部分,我在别名“er”上方给出了查询,并尝试使用“row_to_json(er.*)”将其作为 json 返回,这当然包括q.id 也是如此,有没有办法排除它?我不希望它出现在结果中,但我需要它在子查询中加入视图的其余部分。再次感谢。
    • 很高兴帮助@Chris。当然,您可以通过将此部分注释为--q.id, 并保留其余部分来排除它。你问这个,还是我误会了..?
    • 不完全我已经更新了原始帖子以显示选择本身是一个子查询,我需要 q.id 以便我可以将该选择加入到视图的其余部分,所以 er.id是必需的,但我不想将它包含在 row_to_json(er.*) 中,因为 er.* 将选择返回的所有内容。
    • 只需从 SELECT 列表中删除 q.id,,这不会破坏查询的工作,@Chris 就足够了。
    猜你喜欢
    • 2014-11-08
    • 2023-02-04
    • 2013-12-25
    • 1970-01-01
    • 2017-10-23
    • 2015-12-07
    • 1970-01-01
    • 1970-01-01
    • 2014-10-20
    相关资源
    最近更新 更多