Rumah >pangkalan data >tutorial mysql >Mengapa SERTAI KIRI Saya Tidak Mengembalikan Sifar Dikira dalam PostgreSQL?

Mengapa SERTAI KIRI Saya Tidak Mengembalikan Sifar Dikira dalam PostgreSQL?

DDD
DDDasal
2025-01-14 10:57:44904semak imbas

Why Doesn't My LEFT JOIN Return Zero Counts in PostgreSQL?

PostgreSQL LEFT JOIN: Memastikan Kiraan Sifar Dikembalikan

Isu biasa dengan PostgreSQL LEFT JOIN ialah kegagalan untuk mengembalikan baris dengan kiraan sifar. Ini berlaku apabila keadaan penapisan diletakkan dengan tidak betul.

Pertimbangkan pertanyaan ini, direka bentuk untuk mengira item peperiksaan bagi setiap organisasi, tetapi hanya mengembalikan organisasi dengan kiraan melebihi sifar:

<code class="language-sql">select o.name as organisation_name,
coalesce(COUNT(exam_items.id)) as total_used
from organisations o
left join exam_items e on o.id = e.organisation_id
where e.item_template_id = #{sanitize(item_template_id)}
and e.used = true
group by o.name
order by o.name</code>

Membetulkan Pertanyaan

Masalahnya terletak pada klausa WHERE. Syarat yang diletakkan di sini menapis selepas penyertaan, dengan berkesan mengalih keluar organisasi kiraan sifar. Penyelesaiannya adalah untuk memindahkan syarat penapisan ke dalam klausa JOIN itu sendiri:

<code class="language-sql">SELECT o.name AS organisation_name, count(e.id) AS total_used
FROM organisations o
LEFT JOIN exam_items e ON e.organisation_id = o.id 
                        AND e.item_template_id = #{sanitize(item_template_id)}
                        AND e.used
GROUP BY o.name
ORDER BY o.name;</code>

Dengan menyepadukan penapis dalam JOIN, kami memastikan bahawa hanya baris yang sepadan disertakan dalam operasi gabungan. Ini menghalang pengecualian tidak sengaja organisasi dengan kiraan sifar.

Nota Penting:

    Gelagat
  • COUNT(): Tidak seperti banyak fungsi agregat, COUNT() tidak pernah kembali NULL. Oleh itu, COALESCE(COUNT(col)) adalah berlebihan.
  • Nol Lajur: Gunakan COUNT() pada lajur NOT NULL, atau pastikan syarat cantuman menjamin nilai bukan nol.
  • Pengoptimuman: Untuk prestasi, terutamanya dengan set data yang besar, pertimbangkan praagregat kiraan dalam subkueri sebelum menyertai jadual organisasi. Ini amat berfaedah apabila mengira kebanyakan atau semua baris.

Atas ialah kandungan terperinci Mengapa SERTAI KIRI Saya Tidak Mengembalikan Sifar Dikira dalam PostgreSQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn