PostgreSQL LEFT JOIN: ゼロカウントが返されるようにする
PostgreSQL の LEFT JOIN
でよくある問題は、カウントがゼロの行を返せないことです。 これは、フィルタリング条件が正しく設定されていない場合に発生します。
次のクエリを考えてみましょう。組織ごとに検査項目をカウントするように設計されていますが、カウントが 0 を超える組織のみを返します。
<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
列に適用するか、結合条件で非 Null 値が保証されていることを確認します。以上がPostgreSQL で LEFT JOIN がゼロカウントを返さないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。