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 BY
kolom dalam daftar target kueri saat kunci utama ditentukan diGROUP BY
klausa
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 BY
danGROUP BY
klausa, tetapi tidak dalamWHERE
atauHAVING
klausa; 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.