ホームページ >データベース >mysql チュートリアル >WHERE 句の右側の列をフィルタリングすると、LEFT JOIN が INNER JOIN になるのはなぜですか?

WHERE 句の右側の列をフィルタリングすると、LEFT JOIN が INNER JOIN になるのはなぜですか?

DDD
DDDオリジナル
2024-12-29 14:47:11741ブラウズ

Why Does a LEFT JOIN Become an INNER JOIN When Filtering on a Right-Side Column in the WHERE Clause?

左結合の動作の質問: 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. foob​​ar = 'somethingelse' 句は、foobar が NULL である tableThree からの行をフィルターで除外します。これは、tableTwo と tableThree の両方で一致する非 NULL 値を持つ行のみが返されることを意味します。

解決策

この動作を解決し、意図した左結合を復元するには、次の手順を実行します。 2 つのオプションがあります:

  1. WHERE を変更句:
AND (c.foobar = 'somethingelse' OR c.foobar IS NULL)

この追加により、左結合の動作を維持しながら、tableThree からの NULL 値を含めることができます。

  1. 結合述語に移動:
LEFT JOIN tableThree AS c ON b.pk = c.fk
AND c.foobar = 'somethingelse'

移動によりc.foobar 条件を結合述語に組み込むと、クエリは結合内で必要なフィルタリング基準を明示的に指定し、一致する行のみが結合されるようにします。

以上がWHERE 句の右側の列をフィルタリングすると、LEFT JOIN が INNER JOIN になるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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