非等価結合とは
SQLにおいてテーブルをjoinする際の結合条件が等価ではないことである。
on句でbetweenや不等号が使われる。
勘違いしやすいところ
これは非等価式
SELECT e.employee_id,h.employee_id, e.first_name, e.last_name, e.hire_date,h.start_date , h.end_date
FROM hr.employees e
inner join hr.job_history h
on e.hire_date BETWEEN h.start_date AND h.end_date
;
これは等価式
SELECT e.employee_id,h.employee_id, e.first_name, e.last_name, e.hire_date,h.start_date,h.end_date
FROM hr.employees e
inner join hr.job_history h
on e.employee_id = h.employee_id
order by 1;
on句で等号なのかそれ以外かが重要である。
挙動
クロス結合をon句でフィルターしている動きになる。
つまり、on句での条件が全く絞り込めていない場合、結果はクロス結合時と同じになってしまう。逆に言えば、on句の条件とクロス結合時のwhere句の条件が一緒である場合、同じ結果が持たされるであろう。
しかし、where句以降でフィルターするクロス結合とon句で結合時にフィルターするので、クロス結合の方が処理が遅くなる可能性は高い。
感想
仕事で使用したことがないので戸惑った。
あまり仕事では使いたくない構文である。