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句