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

Rel memperluas bidang dengan ruang lingkup, PG tidak menyukainya

Seperti yang dijelaskan Frank, PostgreSQL akan menolak kueri apa pun yang tidak mengembalikan kumpulan baris yang dapat direproduksi.

Misalkan Anda memiliki kueri seperti:

select a, b, agg(c)
from tbl
group by a

PostgreSQL akan menolaknya karena b dibiarkan tidak ditentukan dalam group by penyataan. Jalankan itu di MySQL, sebaliknya, dan itu akan diterima. Namun, dalam kasus terakhir, jalankan beberapa penyisipan, pembaruan, dan penghapusan, dan urutan baris pada halaman disk menjadi berbeda.

Jika memori berfungsi, detail implementasi adalah agar MySQL benar-benar akan mengurutkan berdasarkan a, b dan mengembalikan b pertama di set. Tetapi sejauh menyangkut standar SQL, perilakunya tidak ditentukan -- dan tentu saja, PostgreSQL tidak selalu urutkan sebelum menjalankan fungsi agregat.

Berpotensi, ini dapat menghasilkan nilai b yang berbeda dalam hasil yang diatur dalam PostgreSQL. Dan dengan demikian, PostgreSQL menghasilkan kesalahan kecuali Anda lebih spesifik:

select a, b, agg(c)
from tbl
group by a, b

Yang disoroti oleh Frank adalah, di PostgreSQL 9.1, jika a adalah kunci utama, maka Anda dapat meninggalkan b tidak ditentukan -- perencana telah diajari untuk mengabaikan grup berikutnya berdasarkan bidang ketika kunci utama yang berlaku menyiratkan baris yang unik.

Khusus untuk masalah Anda, Anda perlu menentukan grup Anda seperti yang Anda lakukan saat ini, plus setiap bidang yang menjadi dasar agregat Anda, yaitu "widgets"."id", "widgets"."user_id", [snip] tetapi bukan hal-hal seperti sum(amount) , yang merupakan panggilan fungsi agregat.

Sebagai catatan di luar topik, saya tidak yakin bagaimana ORM/model Anda bekerja tetapi SQL yang dihasilkannya tidak optimal. Banyak dari gabungan luar kiri itu tampak seperti gabungan dalam. Ini akan memungkinkan perencana untuk memilih pesanan bergabung yang sesuai jika berlaku.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Penjadwal Acara di PostgreSQL?

  2. Bagaimana cara membuat migrasi Rails untuk menghapus/mengubah presisi dan skala pada desimal?

  3. Postgresql, pilih bidang kosong

  4. Mengambil baris dari beberapa tabel dengan UNION ALL atau menggunakan satu tabel dalam produksi?

  5. Postgres - ERROR:pernyataan yang disiapkan S_1 sudah ada