外部結合におけるONとWHEREの違い

2015/04/01

外部結合において、二つのテーブルの結合条件以外に固定値等も条件に加えるとき、条件をON句に書くかWHERE句に書くかで結果が異なってくる。

論理削除されているデータを除いて、トランザクションテーブルとマスタテーブルを結合する例

■ON句に書く場合

ON句に書くと、M.DEL_FLG = '0'に合致しないデータも、M.NAMEがNULLとして検索することができる。

■WHERE句に書く場合

WHERE句に書くと、M.DEL_FLG = '0'は、結合された結果に対して評価されるため、M.DEL_FLG = '1'のデータが検索対象から外れる。

落とし穴は、M.DEL_FLG = '0'がM.DEL_FLG IS NULLに対しても偽になるということ。

M.DEL_FLGをNOT NULLにしておけば、NULL判断は不要になるはずだが、左外部結合して検索される結果のM.DEL_FLGは、NULLになる可能性がある。
WHERE句に書いているため、左外部結合後の結果に対して評価され、トランザクションテーブルにはあるもののマスタテーブルで論理削除されているデータが検索できなくなってしまう。(つまり内部結合と同じになってしまう)

結論、左外部結合をするとき、WHERE句に条件を書くのは、左側のテーブルのものだけにしなくてはいけない。

-SQL