ホームページ >データベース >mysql チュートリアル >SQLの左外結合が左のテーブルよりも多くの行を返すのはなぜですか?

SQLの左外結合が左のテーブルよりも多くの行を返すのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-25 01:17:09718ブラウズ

Why Does My SQL LEFT OUTER JOIN Return More Rows Than the Left Table?

SQL LEFT OUTER JOIN について: なぜ左側のテーブルより行が多いのか?

LEFT OUTER JOIN についてよくある誤解は、左のテーブルから常に正確な行数を返すということです。 左側のテーブルのすべての行が含まれますが、右側のテーブルに重複した一致がある場合、実際にはさらに行が生成される可能性があります。

これを例で説明してみましょう:

次のクエリについて考えてみましょう:

<code class="language-sql">SELECT     
    SUSP.Susp_Visits.SuspReason, SUSP.Susp_Visits.SiteID
FROM
    SUSP.Susp_Visits 
LEFT OUTER JOIN
    DATA.Dim_Member ON SUSP.Susp_Visits.MemID = DATA.Dim_Member.MembershipNum</code>

このクエリは、Susp_Visits (左側のテーブル) と Dim_Member (右側のテーブル) を結合することを目的としています。 直観的には、最大 4935 行が予想されるかもしれません (これが Susp_Visits の数であると仮定します)。ただし、実際の結果はさらに大きくなる可能性があります。

その理由は、LEFT OUTER JOIN が左テーブルと右テーブル間のすべて の一致に対して結果セットに行を作成するためです。 Susp_Visits 内の 1 つの行が Dim_Member 内の複数の行と一致する場合、その行は出力で複製され、当初の予想よりも多くの行が生成されます。

したがって、LEFT OUTER JOIN の後の行数が予想よりも大きい場合は、結合条件に基づいて、左側のテーブルの少なくとも 1 つの行が右側のテーブルに対応する複数の行があることを示します。

これに対処するには:

  • 左側のテーブルのデータのみが必要ですか? 結合せずに左側のテーブルで SELECT ステートメントを使用するだけです。
  • 重複を削除しますか? DISTINCT 文に SELECT 句を追加します: SELECT DISTINCT SUSP.Susp_Visits.SuspReason, SUSP.Susp_Visits.SiteID ... これにより、結果セットから重複行が削除されます。

これは LEFT OUTER JOIN の動作を明確にし、結果セットが左側のテーブルの行数を超える状況を処理するための解決策を提供します。

以上がSQLの左外結合が左のテーブルよりも多くの行を返すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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