首頁 >資料庫 >mysql教程 >為什麼我的 LEFT JOIN 在 PostgreSQL 中不回傳零計數?

為什麼我的 LEFT JOIN 在 PostgreSQL 中不回傳零計數?

DDD
DDD原創
2025-01-14 10:57:44904瀏覽

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

PostgreSQL LEFT JOIN:確保回傳零計數

PostgreSQL LEFT JOIN 的一個常見問題是無法傳回計數為零的行。 當過濾條件放置不正確時,就會發生這種情況。

考慮此查詢,旨在對每個組織的考試項目進行計數,但僅返回計數大於零的組織:

<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>

更正查詢

問題出在WHERE子句上。 此處放置的條件會過濾 連接之後,有效地刪除零計數組織。解決方案是將過濾條件移至 JOIN 子句本身:

<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>

透過將過濾器整合到 JOIN 中,我們確保連接操作中僅包含匹配的行。這可以防止意外排除計數為零的組織。

重要提示:

  • COUNT() 的行為: 與許多聚合函數不同,COUNT() 永遠不會回傳 NULL。 因此,COALESCE(COUNT(col))是多餘的。
  • 列空值:COUNT() 應用到 NOT NULL 列,或確保連接條件保證非空值。
  • 最佳化:為了效能,特別是對於大型資料集,請考慮在加入組織表之前在子查詢中預先聚合計數。 這在計算大多數或所有行時特別有用。

以上是為什麼我的 LEFT JOIN 在 PostgreSQL 中不回傳零計數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn