LEFT OUTER JOIN 問題: レコード数が左側のテーブルを超えていますか?
LEFT OUTER JOIN は常に左側のテーブルのすべてのレコードを返すことが一般的に受け入れられていますが、あるユーザーは、クエリが予想よりも多くの結果を返したときに混乱しました。
問題の 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
真実を明らかにしましょう:
誤解は、LEFT OUTER JOIN が左側のテーブル内の一致しない行に対してのみ NULL 値を返すという仮定です。実際、右側のテーブルの複数の行が左側のテーブルの行と一致する場合でも、一致するすべての行が返されます。
例:
次の形式を考えてみましょう:
**Susp_Visits** | **Dim_Member** | |
---|---|---|
MemID: 1 | MembershipNum: 1 | |
MemID: 1 | MembershipNum: 2 | |
MemID: 2 | MembershipNum: NULL |
MemID に基づく LEFT OUTER JOIN は次の結果を生成します:
**SuspReason** | **SiteID** | **MembershipNum** |
---|---|---|
1 | 1 | 1 |
1 | 1 | 2 |
2 | 2 | NULL |
ご覧のとおり、Susp_Visits.SuspReason が 1 の行は、Dim_Member の 2 つの行と一致するため、重複しています。
代替:
左側のテーブルから一意の行のみを取得することが目的の結果である場合、LEFT OUTER JOIN は必要ありません。左側のテーブルから簡単な SELECT を実行するだけです:
SELECT SuspReason, SiteID FROM SUSP.Susp_Visits
以上がLEFT OUTER JOIN パズル: 左テーブルのレコードよりも多くの結果が得られるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。