ホームページ > データベース > mysql チュートリアル > 左結合と WHERE 句: これらはどのように相互作用し、予期しない結果を回避するにはどうすればよいですか?

左結合と WHERE 句: これらはどのように相互作用し、予期しない結果を回避するにはどうすればよいですか?

DDD
リリース: 2024-12-31 18:05:12
オリジナル
993 人が閲覧しました

Left Joins and WHERE Clauses: How Do They Interact, and How Can I Avoid Unexpected Results?

左結合と WHERE 句の特徴

データ取得操作を実行するとき、開発者は多くの場合、左結合を使用して複数のテーブルからの情報を結合します。ただし、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'
ログイン後にコピー

直感的には、このステートメントは、c.foobar のフィルター条件を指定して、tableThree と tableTwo の間の左結合を実行することを期待します。ただし、c.foobar = 'somethingelse' を含む WHERE 句の存在により、左結合の特性が誤って変更されてしまいます。

左結合の右側の値 (この場合は c.foobar) がWHERE 句に含めると、値が NULL ではない行のみが結果セットに含まれます。したがって、左結合は効果的に内部結合のように動作し、c.foobar.

の NULL 値を持つすべての行を削除します。上記の例の左結合の意図された動作を維持するには、次のいずれかを使用できます。アプローチ:

  • WHERE 句を書き換えます: c.foobar = 'somethingelse' を次のように置き換えます。 AND (c.foobar = 'somethingelse' OR c.foobar IS NULL) などの NULL 値を許可する条件。
  • フィルタを結合述語に移動します。 LEFT を変更します。 JOIN 句は次のようになります。 LEFT JOIN tableThree AS c ON b.pk = c.fk AND c.foobar = 「何か別のもの」。フィルタを結合自体内に配置すると、c.foobar の NULL 値が保持されるため、左結合の動作は変更されません。

以上が左結合と WHERE 句: これらはどのように相互作用し、予期しない結果を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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