在PostgreSQL中将select语句嵌套在array_to_json(array_agg(row_to_json())中

时间:2017-10-17 22:46:04

标签: sql postgresql subquery

我试图理解为什么会这样:

select
    array_to_json(array_agg(row_to_json(positions_table)))
from (
    select
        sum(start_month),
        function_id,
        profile_id
    from positions as subquery
    group by function_id, profile_id
) as positions_table

但这不是:

select
    profiles.id,
    (array_to_json(array_agg(row_to_json(
        select
            sum(start_month),
            function_id,
            profile_id
        from positions as subquery
        group by function_id, profile_id
    ))))
from profiles

似乎我不允许将select...语句放在array_to_json(array_agg(row_to_json()))内,而是需要引用一个表。

但我很怀疑我可能会遗漏一些东西。

错误为syntax error near select

1 个答案:

答案 0 :(得分:2)

您可以通过将子选项包含在括号中来修复语法错误,但之后您会看到第二个错误; postgres会报告:

  

子查询必须只返回一列

如果您修复 错误,您会看到:

  

列“profiles.id”必须出现在GROUP BY子句中或用于聚合函数

......这更接近问题的真正原因。添加GROUP BY id将获得postgres报告根本原因:

  

用作表达式

的子查询返回的多行

函数row_to_json期待单行。

要按个人资料ID汇总您的json摘要,您必须执行加入。

SELECT
  pr.id,
  array_to_json(array_agg(row_to_json(positions_table.*)))
FROM profiles pr JOIN (
  SELECT sum(start_month), function_id, profile_id
  FROM positions
  GROUP BY function_id, profile_id
) positions_table ON positions_table.profile_id = pr.id
GROUP BY pr.id

(您可以从.*中删除positions_table.*,我只是为了清晰起见而添加了它。