ホームページ > データベース > mysql チュートリアル > WHERE 句で右側のテーブルの列をフィルタリングすると、左側の結合が内部結合のように動作するのはなぜですか?

WHERE 句で右側のテーブルの列をフィルタリングすると、左側の結合が内部結合のように動作するのはなぜですか?

DDD
リリース: 2024-12-30 03:08:10
オリジナル
795 人が閲覧しました

Why Does My Left Join Act Like an Inner Join When Filtering on the Right Table's Column in the WHERE Clause?

左結合の難題: 内部結合になると時間がかかる

データベース ウィザードの領域では、左結合を使用して複雑なデータ取得を実行するのが一般的です。ただし、場合によっては、左結合が期待どおりに動作しないことがあります。

次のクエリを想像してください:

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';
ログイン後にコピー

興味深いことに、c.foobar 条件が WHERE 句に次のように配置されている場合です。上では、左結合と思われる部分が内部結合に変化しているように見えます。結果は、a.foo と c.foobar の両方の基準が満たされる場合にのみ返されます。

なぜ変態するのでしょうか?鍵は WHERE 句にあります。左結合の右側 (ON 句の右側のテーブルを参照する右側) の値が WHERE 句で指定されている場合、すべての NULL 値が破棄され、実質的に左結合が内部結合に縮小されます。簡単に言うと、c.foobar が tableThree に存在しない場合、クエリは行を返しません。

この苦境を回避するには、2 つのオプションがあります。

  1. 検討する WHERE 句を修正する有効な値と NULL 値の両方c.foobar:
AND (c.foobar = 'somethingelse' OR c.foobar IS NULL)
ログイン後にコピー
  1. c.foobar 条件を結合述語に移動します:
LEFT JOIN tableThree AS c ON b.pk = c.fk AND c.foobar = 'somethingelse'
ログイン後にコピー

これらのソリューションのどちらを選択するかは、特定のクエリの要件。ただし、WHERE 句が存在する場合の左結合の基本的な動作を理解することは、データ取得手法を習得するために重要です。

以上がWHERE 句で右側のテーブルの列をフィルタリングすると、左側の結合が内部結合のように動作するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート