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

キーで集計するときに、従属列を `GROUP BY`から除外できないのはなぜですか?

    PKのみがGROUP BYの基になるテーブルのすべての列をカバーするためです 句。したがって、最初のクエリは機能します。 UNIQUE 制約はありません。

    延期できないUNIQUEの組み合わせ およびNOT NULL 制約も適格です。しかし、それは実装されていません-SQL標準で知られている他のいくつかの機能依存性も同様です。この機能の主な作者であるPeterEisentrautはもっと念頭に置いていましたが、当時、需要は低く、関連するコストは高い可能性があると判断されました。 pgsql-hackersの機能に関する説明を参照してください。

    マニュアル:

    GROUP BYの場合 が存在するか、集計関数が存在する場合、SELECTには無効です。 集計関数内を除いて、またはグループ化されていない列が機能的にグループ化された列に依存している場合を除いて、グループ化されていない列を参照する式をリストします。グループ化された列(またはそのサブセット)が、グループ化されていない列を含むテーブルの主キーである場合、機能依存性が存在します。

    そしてもっと明確に:

    PostgreSQLは機能依存性を認識します(GROUP BYから列を削除できるようにします )テーブルの主キーがGROUP BYに含まれている場合のみ リスト。 SQL標準では、認識すべき追加の条件が指定されています。

    c.vin以降 UNIQUE NOT NULLです 、代わりにPK列を使用して2番目のクエリを修正できます:

    ...
    group by c.id;
    

    余談ですが、参照整合性が適用され、テーブル全体がクエリされますが、指定されたクエリは両方とも大幅に安くなる可能性があります。appraisalの行を集計します。 参加します。これにより、GROUP BYが不要になります 外側のSELECT アプリオリ。いいね:

    SELECT c.vin, c.color, c.brand
         , a.min_appraisal
         , a.max_appraisal
    FROM   car c
    LEFT   JOIN (
       SELECT car_vin
            , min(price) AS min_appraisal
            , max(price) AS max_appraisal
       FROM   appraisal
       GROUP  BY car_vin
       ) a ON a.car_vin = c.vin;
    

    参照:

    • 1回のクエリで複数のarray_agg()を呼び出す

    関連:

    • MySQLで機能するSQLステートメントがPostgresqlで機能しない-Sum&group_by rails 3
    • PostgreSQL-GROUPBY句



    1. Springデータのエンティティにスキーマ名を追加しますか?

    2. ストアドプロシージャを使用して、SQLServer2005の文字列にサブ文字列が含まれているかどうかを確認します

    3. SQLServerで自動インクリメント主キーを定義する方法

    4. 大量のメモリを消費する大規模なDjangoQuerySetを反復処理するのはなぜですか?