左結合の再考: ON 句と WHERE 句の区別
SQL Server では、LEFT JOIN 操作はデータの取得において重要な役割を果たします。複数のテーブルから。ただし、ON 句と WHERE 句での結合条件の指定の間には、微妙ではありますが重要な違いが存在します。
次のクエリを考えてみましょう。
SELECT t1.f2 FROM t1 LEFT JOIN t2 ON t1.f1 = t2.f1 AND cond2 AND t2.f3 > something
このクエリは、次のクエリから f2 列を取得しようとします。テーブル t1 に結合しますが、オプションで f1 列の一致する値と追加の条件 (cond2 および t2.f3 > に基づいてテーブル t2 の行を結合します)。
対照的に、次のクエリは異なるアプローチを採用しています。
SELECT t1.f2 FROM t1 LEFT JOIN t2 ON t1.f1 = t2.f1 AND cond2 WHERE t2.f3 > something
ここでは、結合条件は ON 句のみで指定されていますが、t2.f3 > は ON 句でのみ指定されています。何かの条件が WHERE 句のフィルターとして追加されます。
違いを理解する
これら 2 つのクエリの主な違いは、操作の順序にあります。
例
この違いを説明するために、候補の表を考えてみましょう(候補者) と投票の表 (投票):
candidates | name | |-------------| | Obama | | Romney | votes | voter | voted_for | |-------------|-------------| | Mickey Mouse | Romney | | Donald Duck | Obama |
クエリ 1:
SELECT * FROM candidates c LEFT JOIN votes v ON c.name = v.voted_for AND v.voter = 'Donald Duck'
このクエリは、ロムニーを含むすべての候補者を取得します。ドナルドダックはオバマに投票した。これは、v.voter = 'Donald Duck' 条件が ON 句で指定されており、結合操作にのみ影響するためです。
クエリ 2:
SELECT * FROM candidates c LEFT JOIN votes v ON c.name = v.voted_for WHERE v.voter = 'Donald Duck'
このクエリでは、v.voter = 'Donald Duck' 条件が WHERE 句に移動されます。その結果、ロムニーはドナルドダックからの一致する票がないため、結果セットから除外されます。ドナルドダックから投票を受けたオバマのみが返されます。
結論
LEFT JOIN 操作の ON 句と WHERE 句の区別を理解することは、効果的に情報を取得するために不可欠です。 SQL Server 内のデータ。適切な句に条件を慎重に配置することで、一致基準を制御し、結合された結果セットを効率的にフィルタリングできます。
以上がSQL Server の LEFT JOIN: `ON` 句と `WHERE` 句の違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。