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句