2017-10-17 11 views
1
でarray_to_json内側のSELECT文(ARRAY_AGG(row_to_json()))

私は、この作品理由を理解しようとしています:巣PostgreSQLの

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です。

+0

FYI:3回のデータ変換(json、array、json)ではなく、代わりに希望の結果を得るために 'jsonb_agg()'を使うべきです[もっと見る](https://www.postgresql.org/docs/9.6/ static/functions-aggregate.html)。また、 'row_to_json'は' record'を入力として期待していますが、サブクエリはレコードのレコードではないので、N行を変換するために1行をjsonに変換することは期待できません。 –

答えて

1

サブクラスを角かっこで囲んで構文エラーを修正できますが、2番目のエラーが表示されます。 Postgresは報告します:

コラム "profiles.id" に表示される必要があります:あなたが参照してくださいね誤りがあることを固定した場合

サブクエリは1列のみ

を返す必要がありますGROUP BY句を使用するか、集計関数で使用する

... thに近づいていますあなたの問題の本当の原因。表現

機能row_to_jsonは、単一の行を期待しているとして使用するサブクエリによって返さ

複数の行:GROUP BY idを追加すると、Postgresが根本的な原因を報告するために取得します。

jsonサマリーをプロファイルIDで集計するには、結合を実行する必要があります。

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.*から.*をドロップすることができます)。

関連する問題