なぜ T-SQL の左結合が予期した結果を生成しないのですか?
提供された SQL クエリでは、LEFT JOIN を使用しているにもかかわらず、 2 つのテーブル (#appSteps と #appProgress) では、予想される 3 行ではなく 2 行のみが返されます。この予期しない動作の原因を特定するために、クエリとそのコンポーネントを分析してみましょう。
LEFT JOIN 操作は、対応する一致が存在しない場合でも、左側のテーブル (#appSteps) からすべての行を返すことを目的としています。右側のテーブル (#appProgress)。ただし、クエリには #appSteps:
where s.section is not null
から NULL 行を除外する条件が WHERE 句に含まれています。この条件により、結果セットが #appSteps.section が NULL 以外の行に事実上制限されてしまいます。 LEFT JOIN を INNER JOIN に変換します。 #appSteps.section 内の NULL 値を持つ行が除外され、その結果、予期された 3 行目が欠落します。
この問題を修正するには、条件を LEFT JOIN の ON 条件に移動する必要があります:
Left Join #appProgress P On S.stepId = P.stepId And P.appId = 101
ON 句で条件を指定すると、それが結合基準の一部となり、#appSteps から一致する行のみがフェッチされるようになります。 #アプリの進捗状況。その結果、LEFT JOIN は #appProgress に一致するかどうかに関係なく、NULL 値を持つ行を含む #appSteps からすべての行を取得します。
このアプローチを使用すると、クエリは元のように必要な 3 つの行を返します。
以上がT-SQL LEFT JOIN が予想よりも少ない行を返すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。