ホームページ >データベース >mysql チュートリアル >WHERE 句の右側の列をフィルタリングすると、LEFT JOIN が INNER JOIN になるのはなぜですか?
左結合の動作の質問: WHERE 句を使用した内部結合への変換
次の SQL ステートメントを考えてみましょう:
SELECT a.foo b.bar c.foobar FROM tableOne AS a INNER JOIN tableTwo AS b ON a.pk = b.fk LEFT JOIN tableThree AS c ON b.pk = c.fk WHERE a.foo = 'something' AND c.foobar = 'somethingelse'
このシナリオでは、左結合動作が期待されます。ただし、観察された動作では、AND c.foobar = 'somethingelse' 句の存在に基づいて、左結合が内部結合に変換されているように見えます。 tableThree 内の対応する 'somethingelse' 値が欠落している行は返されません。
動作を理解する
鍵點は、WHERE 句と LEFT JOIN の間の相互作用にあります。 。 WHERE 句の左結合の右側から NULL 以外の値が指定されると、NULL 値が削除され、事実上結合が内部結合に変わります。
この場合、AND c. foobar = 'somethingelse' 句は、foobar が NULL である tableThree からの行をフィルターで除外します。これは、tableTwo と tableThree の両方で一致する非 NULL 値を持つ行のみが返されることを意味します。
解決策
この動作を解決し、意図した左結合を復元するには、次の手順を実行します。 2 つのオプションがあります:
AND (c.foobar = 'somethingelse' OR c.foobar IS NULL)
この追加により、左結合の動作を維持しながら、tableThree からの NULL 値を含めることができます。
LEFT JOIN tableThree AS c ON b.pk = c.fk AND c.foobar = 'somethingelse'
移動によりc.foobar 条件を結合述語に組み込むと、クエリは結合内で必要なフィルタリング基準を明示的に指定し、一致する行のみが結合されるようにします。
以上がWHERE 句の右側の列をフィルタリングすると、LEFT JOIN が INNER JOIN になるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。