SQL:LEFT JOIN で結合したテーブルの検索条件をWHEREで書くと普通のJOINと同等になる
ハマりがちな間違い。
WHERE は「JOIN 後の列」のに対してかかるので、LEFT JOIN した後から WHERE 句で LEFT JOIN したテーブルの列で絞り込んでしまうと、LEFT JOIN によって NULL になったレコードが全部消えてしまう。
(ややこしいのは、SELECTで出力に選んでいなくても、WHERE では LEFT JOIN 後の列として評価されてしまう点)
これを避けるには、ON 句で絞り込む。(あるいは WHERE句で OR 条件で IS NULL とする。これは推奨しない。)
code:sql
SELECT a.k1, a.af1, b.bf2
FROM a
LEFT JOIN b
ON a.k1 = b.k1
WHERE
b.bf1 = 'x' -- LEFT JOIN の意味が無くなる。SELECT で選んでなくても LEFT JOIN した後の列として評価される。
code:sql
SELECT a.k1, a.af1, b.bf2
FROM a
LEFT JOIN b
ON a.k1 = b.k1
AND b.bf1 = 'x'