sql >> データベース >  >> RDS >> PostgreSQL

PGError:エラー:オブジェクトとそのhas_manyオブジェクトのARクエリのWHERE句で集計は許可されていません

    エラーメッセージは次のことを示しています:

    WHERE句で許可されていない集計

    count() 集計関数です。そのためにHAVING句を使用します。
    クエリは次のようになります:

    SELECT r.*
    FROM   recommendations r
    JOIN   approvals       a ON a.recommendation_id = r.id
    WHERE  r.user_id = $current_user_id
    GROUP  BY r.id
    HAVING count(a.recommendation_id) = 1
    

    PostgreSQL 9.1以降では、GROUP BYで十分です。 主キー テーブルの(recommendations.idを想定) PK)。 9.1より前のPostgresバージョンでは、すべてを含める必要がありました。 SELECTの列 GROUP BYに集約されていないリスト リスト。 recommendations.*を使用 SELECTで リスト、それはテーブルのすべての列になります。

    PostgreSQL 9.1のリリースノートを引用します:

    GROUP BY以外を許可する GROUP BYで主キーが指定されている場合のクエリターゲットリストの列 条項(Peter Eisentraut)

    サブセレクトでシンプル

    いずれにせよ、これはより簡単で高速で、同じことを行います:

    SELECT *
    FROM   recommendations r
    WHERE  user_id = $current_user_id
    AND   (SELECT count(*)
           FROM   approvals
           WHERE  recommendation_id = r.id) = 1;
    

    JOINで行を乗算することは避けてください 事前に、それらを集約して戻す必要はありません。



    1. IAMポリシーテンプレートを使用したAWSでのScaleGridパーミッションの設定

    2. MySQL-WHERE句でCOUNT(*)を使用

    3. SQL Serverで「datetime」を「time」に変換する(T-SQLの例)

    4. ClouderaCDPデータセンターをOracleCloudInfrastructure(OCI)にデプロイする