SELECT a.license_id, a.limit_call
, count(b.license_id) AS overall_count
FROM "License" a
LEFT JOIN "Log" b USING (license_id)
WHERE a.license_id = 7
GROUP BY a.license_id -- , a.limit_call -- add in old versions
HAVING a.limit_call > count(b.license_id)
Sejak Postgres 9.1 kunci utama mencakup semua kolom tabel di GROUP BY ayat. Di versi lama Anda harus menambahkan a.limit_call ke GROUP BY daftar. Catatan rilis untuk 9.1:
Izinkan non-
GROUP BYkolom dalam daftar target kueri saat kunci utama ditentukan diGROUP BYklausa
Bacaan lebih lanjut:
- Mengapa saya tidak dapat mengecualikan kolom dependen dari `GROUP BY` saat saya mengagregasi berdasarkan kunci?
Kondisi yang Anda miliki di WHERE klausa harus pindah ke HAVING klausa karena mengacu pada hasil fungsi agregat (setelah WHERE telah diterapkan). Dan Anda tidak dapat merujuk ke kolom keluaran (alias kolom) di HAVING klausa, di mana Anda hanya dapat mereferensikan kolom input. Jadi, Anda harus mengulang ekspresi. Panduan:
Nama kolom keluaran dapat digunakan untuk merujuk ke nilai kolom di
ORDER BYdanGROUP BYklausa, tetapi tidak dalamWHEREatauHAVINGklausa; di sana Anda harus menuliskan ekspresinya.
Saya membalik urutan tabel di FROM klausa dan membersihkan sintaks sedikit untuk membuatnya kurang membingungkan. USING hanya kenyamanan notasi di sini.
Saya menggunakan LEFT JOIN alih-alih JOIN , jadi Anda tidak mengecualikan lisensi tanpa log sama sekali.
Hanya nilai bukan nol yang dihitung oleh count() . Karena Anda ingin menghitung entri terkait dalam tabel "Log" lebih aman dan sedikit lebih murah menggunakan count(b.license_id) . Kolom ini digunakan dalam join, jadi kita tidak perlu pusing-pusing apakah kolomnya bisa null atau tidak.count(*) bahkan lebih pendek dan sedikit lebih cepat. Jika Anda tidak keberatan untuk mendapatkan hitungan 1 untuk 0 baris di tabel kiri, gunakan itu.
Selain:Saya akan menyarankan tidak untuk menggunakan pengidentifikasi huruf besar-kecil di Postgres jika memungkinkan. Sangat rawan kesalahan.