ホームページ > データベース > mysql チュートリアル > PostgreSQL の LEFT JOIN クエリのカウントが保持されずに増加するのはなぜですか?

PostgreSQL の LEFT JOIN クエリのカウントが保持されずに増加するのはなぜですか?

Linda Hamilton
リリース: 2025-01-23 12:23:10
オリジナル
411 人が閲覧しました

Why Does My PostgreSQL LEFT JOIN Query Multiply Counts Instead of Preserving Them?

PostgreSQL LEFT JOIN: 予期しない行数の乗算

複数の LEFT JOIN を使用する PostgreSQL 9.1 クエリは、行数を保持するのではなく、予期せず増加させました。 このクエリは、ユーザー ID、口座残高、食料品店への訪問数、魚市場への訪問数を取得することを目的としていました。 欠陥のあるクエリにより誤ったカウントが発生し、実際のカウントではなく繰り返し値が表示されました。

この問題は、PostgreSQL の左から右の JOIN 処理順序に起因して発生します。 後続の JOIN は以前の結合からの行を複製するため、カウントが増加します。たとえば、食料品店への訪問が 3 件、魚市場への訪問が 12 件あった場合、結果では、予想される 3 件と 12 件ではなく、誤ってそれぞれ 12 件のエントリが表示されます。

この解決策には、参加する前に訪問数を事前に集計することが含まれます。 これにより、行の乗算の問題が回避されます。修正されたクエリは次のとおりです:

<code class="language-sql">SELECT u.id, u.account_balance, g.grocery_visits, f.fishmarket_visits
FROM users u
LEFT JOIN (
   SELECT user_id, count(*) AS grocery_visits
   FROM grocery
   GROUP BY user_id
) g ON g.user_id = u.id
LEFT JOIN (
   SELECT user_id, count(*) AS fishmarket_visits
   FROM fishmarket
   GROUP BY user_id
) f ON f.user_id = u.id
ORDER BY u.id;</code>
ログイン後にコピー

この改訂されたクエリは、ユーザーごとの食料品店と魚市場の訪問数を正確に返し、乗算の問題を解決しました。 たとえば、ユーザーが食料品店に 3 回訪問し、魚市場に 4 回訪問した場合、出力はこれを正確に反映し、元のクエリで見られた誤った繰り返しを回避します。

以上がPostgreSQL の LEFT JOIN クエリのカウントが保持されずに増加するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート