条件付きの LEFT JOIN: ON と WHERE の違いはどこですか?
SQL Server では、LEFT JOIN は次の条件に基づいて 2 つのテーブルの行を結合します。指定された結合条件。 ON 句は LEFT JOIN ステートメント内の結合条件を定義しますが、WHERE 句は結合操作の後に行をフィルタリングします。この微妙な違いを正しく理解していないと、予期しない結果が生じる可能性があります。
次のクエリを考えてみましょう:
SELECT t1.f2 FROM t1 LEFT JOIN t2 ON t1.f1 = t2.f1 AND cond2 AND t2.f3 > something
驚くべきことに、このクエリは次のクエリと同じ結果を生成しません:
SELECT t1.f2 FROM t1 LEFT JOIN t2 ON t1.f1 = t2.f1 AND cond2 WHERE t2.f3 > something
説明
ON 句どの行が結合に参加するかを決定する上で重要な役割を果たします。 ON で指定された条件は、行が一致して結合結果に含まれるためには true である必要があります。対照的に、WHERE 句はすでに結合されている行をフィルタリングします。
最初のクエリでは、条件 t2.f3 > が条件になります。何かが ON 句の一部です。したがって、t2.f3 が何かより大きい行のみが結合に含まれます。これは、t2.f3 が何かより大きくない一致する行は結果から除外されることを意味します。
2 番目のクエリでは、条件 t2.f3 > が結果から除外されます。何かが WHERE 句の一部です。この句は、結合の実行後に評価されます。したがって、ON 句の条件 (t1.f1 = t2.f1 および cond2) を満たすすべての行が結合結果の一部になります。次に、WHERE 句でこれらの行をフィルタリングし、t2.f3 が何かより大きい行のみを保持します。
例
この概念を説明するために、候補のテーブル (候補者)と投票表(投票)。投票を受け取った候補者を検索したい場合は、LEFT JOIN を使用できます:
SELECT * FROM candidates c LEFT JOIN votes v ON c.name = v.voted_for
このクエリは、投票を受け取っていない候補者も含め、すべての候補者を返します。条件を WHERE 句に移動すると、次のようになります。
SELECT * FROM candidates c LEFT JOIN votes v ON c.name = v.voted_for WHERE v.voted_for IS NOT NULL
結果には、少なくとも 1 票を獲得した候補者のみが含まれるようになります。
結論
LEFT JOIN の ON 句と WHERE 句の違いを理解することは、データを効果的に操作するために重要です。条件を適切な句に慎重に配置することで、クエリが確実に望ましい結果を返すようにすることができます。
以上がSQL の LEFT JOIN: `ON` 節と `WHERE` 節の主な違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。