はじめに
テーブルの外部結合がいつもわからなくなるのでメモ。
特にレガシーシステムの改修を行っていたらOracle特有の書き方に出くわして、
どっちが左?どっちが右?となるので、標準的な書き方とOracle特有の書き方を列挙。
テーブル
テーブルは以下のように「animalsテーブル」と「categorysテーブル」を用意
animalsテーブル
id |
name |
category_id |
1 |
柴犬 |
1 |
2 |
トイプードル |
1 |
3 |
にわとり |
3 |
4 |
へび |
4 |
5 |
さんま |
5 |
categorysテーブル
id |
category_name |
1 |
犬 |
2 |
猫 |
3 |
鳥 |
5 |
魚 |
内部結合
まずは普通に内部結合
標準の書き方
SELECT animals.id, animals.name, categorys.category_name
FROM animals INNER JOIN categorys
ON animals.category_id = categorys.id;
別解
SELECT animals.id, animals.name, categorys.category_name
FROM animals, categorys
WHERE animals.category_id = categorys.id;
結果
id |
name |
category_name |
1 |
柴犬 |
犬 |
2 |
トイプードル |
犬 |
3 |
にわとり |
鳥 |
5 |
さんま |
魚 |
外部結合(左結合)
標準の書き方
SELECT animals.id, animals.name, categorys.category_name
FROM animals LEFT OUTER JOIN categorys
ON animals.category_id = categorys.id;
Oracle特有の書き方
SELECT animals.id, animals.name, categorys.category_name
FROM animals, categorys
WHERE animals.category_id = categorys.id(+);
結果
id |
name |
category_name |
1 |
柴犬 |
犬 |
2 |
トイプードル |
犬 |
3 |
にわとり |
鳥 |
4 |
へび |
NULL |
5 |
さんま |
魚 |
Oracle特有の書き方の場合、
**(+)**をつける方が親に対してテーブルのデータが足りないという風に考えておく!
**(+)**をつけた方にNULLが入るみたいなイメージ
外部結合(右結合)
標準の書き方
SELECT animals.id, animals.name, categorys.category_name
FROM animals RIGHT OUTER JOIN categorys
ON animals.category_id = categorys.id;
Oracle特有の書き方
SELECT animals.id, animals.name, categorys.category_name
FROM animals, categorys
WHERE animals.category_id(+) = categorys.id;
結果
id |
name |
category_name |
1 |
柴犬 |
犬 |
2 |
トイプードル |
犬 |
NULL |
NULL |
猫 |
3 |
にわとり |
鳥 |
5 |
さんま |
魚 |