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

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

DDD
發布: 2025-01-14 10:57:44
原創
903 人瀏覽過

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板