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中文網其他相關文章!