Karena hanya PK yang mencakup semua kolom dari tabel yang mendasari di GROUP BY
ayat. Karenanya kueri pertama Anda berfungsi. Sebuah UNIQUE
kendala tidak.
Kombinasi dari UNIQUE
yang tidak dapat ditangguhkan dan NOT NULL
kendala juga akan memenuhi syarat. Tapi itu tidak diimplementasikan - serta beberapa dependensi fungsional lainnya yang dikenal dengan standar SQL. Peter Eisentraut, penulis utama fitur tersebut, memiliki lebih banyak pemikiran, tetapi pada saat itu ditentukan bahwa permintaan rendah dan biaya terkait mungkin tinggi. Lihat pembahasan tentang fitur pada pgsql-hackers.
Panduan:
Ketika
GROUP BY
ada, atau ada fungsi agregat apa pun, itu tidak valid untukSELECT
daftar ekspresi untuk merujuk ke kolom yang tidak dikelompokkan kecuali dalam fungsi agregat atau ketika kolom yang tidak dikelompokkan secara fungsional bergantung pada kolom yang dikelompokkan, karena jika tidak, akan ada lebih dari satu nilai yang mungkin untuk dikembalikan untuk kolom yang tidak dikelompokkan. Ketergantungan fungsional ada jika kolom yang dikelompokkan (atau bagiannya) adalah kunci utama dari tabel yang berisi kolom yang tidak dikelompokkan.
Dan lebih eksplisit:
PostgreSQL mengenali ketergantungan fungsional (memungkinkan kolom dihilangkan dari
GROUP BY
) hanya jika kunci utama tabel disertakan dalamGROUP BY
daftar. Standar SQL menetapkan kondisi tambahan yang harus dikenali.
Sejak c.vin
adalah UNIQUE NOT NULL
, Anda dapat memperbaiki kueri kedua dengan menggunakan kolom PK sebagai gantinya:
...
group by c.id;
Selain itu, sementara integritas referensial diterapkan dan seluruh tabel dikueri, kedua kueri yang diberikan bisa jauh lebih murah:baris agregat dalam appraisal
sebelum bergabung. Ini menghilangkan kebutuhan untuk GROUP BY
di bagian luar SELECT
apriori. Seperti:
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;
Lihat:
- Beberapa panggilan array_agg() dalam satu kueri
Terkait:
- Pernyataan SQL berfungsi di MySQL tidak berfungsi di Postgresql - Sum &group_by rails 3
- PostgreSQL - klausa GROUP BY