ホームページ >データベース >mysql チュートリアル >PostgreSQL の LEFT JOIN クエリのカウントが保持されずに増加するのはなぜですか?
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 サイトの他の関連記事を参照してください。