2017-05-10 12 views
0

返される結果の数を制限することに苦心しています。array_agg()から返されます。これまでの質問です:array_aggからの結果の数の制限

SELECT s.*, 
(
    SELECT array_agg(row_to_json(smr.*)) 
    AS "monthRatings" 
) 
FROM services s 
INNER JOIN servicemonthratings smr ON s._id = smr.service_id 
GROUP BY s._id 

上記と同じことを実現するには、もっと良い方法がありますか?

+0

あなたの質問を編集し、サンプルデータと希望する結果を提供してください。あなたの質問は明確ではありません。 –

+0

json値のPostgres配列が本当に必要ですか? JSON配列ではありませんか?あなたは本当に格付けのないサービスを排除する「INNER JOIN」を望んでいますか? –

答えて

0

シンプル:

SELECT s.*, array_agg(row_to_json(smr)) AS "monthRatings" 
FROM services s 
JOIN servicemonthratings smr ON s._id = smr.service_id 
GROUP BY s._id; 
  • 副選択の必要はありません。
  • smr.*ではなく、テーブルエイリアスsmr(行タイプを意味します)を使用しても同じ結果が得られます。
  • services ._idはPKでなければなりません。そうしないとクエリはナンセンスになりません。

    SELECT s.*, smr."monthRatings" 
    FROM services s, LATERAL (
        SELECT json_agg(smr) AS "monthRatings" 
        FROM servicemonthratings 
        WHERE service_id = s._id 
        ) smr; 
    

    今、あなたはservicesを集約する必要はありません。私はあなたが本当に行のJSON配列をしたい疑い、そしてあなたは(まだ)何の評価を持っていないサービスを排除したくない

_idはPKである必要はありません。

サブクエリは常にから行を返します(その中に集約関数があるため)サービスは削除されません。

0

それはあなたがはっきりと混乱していることを意味しません。

  1. jsonを集約するためにarray_aggを使用しません。あなたはjson_aggを使います。あなたがそのようなARRAY_AGG()を使用するつもりなら、あなたがARRAY_AGGを使用するつもりなら
  2. 、あなたにも配列コンストラクタARRAY()
  3. を使用することができ、あなたは外にそれをロールバックしてからそれを取得する必要があります配列リスト。

いくつかのサンプルデータと出力を設定します。