okinawa

IT勉強メモ

テーブル結合でハマったこと

LEFT OUTER JOINで左側にだけ結合条件つけても意味なし

下記のような左テーブルにしか効かない結合条件しても意味無し。

左側は全て出力されるので。

select * from lefttable L
left outer join righttable R
on L.TENPO = '001' --⇐左テーブルにだけの結合条件

例:テーブル2と3を結合

table2とtable3

・まずは普通の結合

SELECT * FROM Table3 t3
LEFT OUTER JOIN table2 t2
ON t3.tenpo = t2.tenpo
and t3.[group] = t2.[group]

結果

・左側にだけ結合条件つけるSQL

SELECT * FROM Table3 t3
LEFT OUTER JOIN table2 t2
ON t3.tenpo = t2.tenpo
and t3.[group] = t2.[group]
and t3.tenpo = '002' --⇐左側テーブルにだけ結合条件

結果2

左側(テーブル3)は「 t3.tenpo = '002'」以外も全部出力されるので意味なし。

結合条件を複数テーブルにするときは注意

下記はテーブル1・2・3を結合するSQL。1と2は普通に結合。3は1と2両方を結合条件に入れている。

SELECT * FROM Table1 t1
LEFT OUTER JOIN table2 t2
on t1.tenpo = t2.tenpo
and t1.[group] = t2.[group]
and t1.date = t2.date
LEFT OUTER JOIN Table3 t3
on t1.tenpo = t3.tenpo --table1と3
and t1.[group] = t3.[group] --table1と3
and t2.date = t3.date --ここだけtable2と3で結合。テーブル1にはないけどテーブル2にはある日付と結合したいんだよなあという時。

・イメージ
t1.date = t2.date でテーブル1にない日付はテーブル2部分もNULLになっている。
t2.date = t3.date でテーブル1にはないけどテーブル2にはある日付と結合しようとしてもそこはNULL。結合できない。