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.