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'
このクエリでは、tableTwo と tableThree の間の左結合は、次の理由により効果的に内部結合に変換されます。 WHERE 句の条件、c.foobar = 'somethingelse'。これは、WHERE 句で左結合の右側から NULL 以外の値 (ここでは「somethingelse」) を指定すると、対応する列が NULL である行がすべて削除され、内部結合動作が発生するためです。
したがって、クエリは、c.foobar の非 NULL 値を持つ tableThree 内の一致する行を持つ tableOne と tableTwo からの行のみを返します。望ましい左結合動作を維持するには、次の解決策を検討してください。
1. WHERE 句に NULL を含める:
条件 c.foobar = 'somethingelse' を AND (c.foobar = 'somethingelse' OR c.foobar IS NULL) に置き換えて、foobar が次のいずれかである行を含めます。他のもの' または NULL。
2.条件を結合述語に移動します:
c.foobar = 'somethingelse' 条件を WHERE 句から結合述語に移動します:
LEFT JOIN tableThree AS c ON b.pk = c.fk AND c.foobar = 'somethingelse'
これを行うと、クエリは保持されます。 c.foobar.
の値に基づいて行をフィルタリングしながら、左結合の動作を行います。以上がWHERE 句は SQL の LEFT JOIN の動作にどのような影響を与えますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。