PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Mengapa saya tidak dapat mengecualikan kolom dependen dari `GROUP BY` saat saya mengagregasi berdasarkan kunci?

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 untuk SELECT 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 dalam GROUP 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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. buka bungkus array postgresql menjadi baris

  2. Query PostgreSQL dengan Npgsql dan Entity Framework menggunakan unaccent

  3. Pilih baris yang tidak ada di tabel lain

  4. Rails:PG::UndefinedTable:ERROR:relasi ... tidak ada

  5. Performa OLTP sejak PostgreSQL 8.3