ホームページ >データベース >mysql チュートリアル >PostgreSQL で LEFT JOIN がゼロカウントを返さないのはなぜですか?

PostgreSQL で LEFT JOIN がゼロカウントを返さないのはなぜですか?

DDD
DDDオリジナル
2025-01-14 10:57:44903ブラウズ

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

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)) は冗長です。
  • 列の NULL: COUNT()NOT NULL 列に適用するか、結合条件で非 Null 値が保証されていることを確認します。
  • 最適化: 特に大規模なデータセットの場合、パフォーマンスを向上させるために、組織テーブルと結合する前にサブクエリでカウントを事前に集計することを検討してください。 これは、ほとんどまたはすべての行をカウントする場合に特に有益です。

以上がPostgreSQL で LEFT JOIN がゼロカウントを返さないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。