外部結合とは (OUTER JOIN)
外部結合とは、SQL において結合条件に対応するレコードがない場合にも指定した核となるテーブルからレコードが除外されない結合方法である。
2つのテーブルを結合してレコードを取得するときに、結合条件を除いた条件で一方のテーブルの条件を満たす
レコードを常に取得したい要件に使用する。
例えば、「取引している会社一覧」に営業担当の社員を付して表示するとき
取引会社先一覧マスターと営業社員一覧マスターを結合して問い合わせしようとする。
このとき、新規開拓した取引先で営業担当が未決の場合に単なる結合では、新規の取引先が問い合わせ結果に含まれなくなる。もちろん表示しなくて良いということはなく、「営業担当:未決」として表示したいのが自然である。
行番号 L.No. | テーブル名 TABLE1 | テーブル名 TABLE2 | 行番号 R.No. |
| 項目名⇒ | NAME1 | KEY1 | KEY2 | NAME2 | |
| 1 | A | 001 | あ | 1 |
| - | - | 002 | い | 2 |
| 2 | C | 003 | - | - | |
| 3 | D | 004 | う | 3 |
外部結合演算子 (+)
上の表において 左のテーブル (TABLE1) はすべて残して、右のテーブル (TABLE2) と結合したい場合 の SQL は
SELECT t1.key1, t1.name1, t2.name2
FROM table1 t1, table2 t2
WHERE t1.key1 = t2.key2(+)
のように付帯したいテーブルの結合キーに (+) をつけることで外部結合される。
関連事項 PL/SQL の 結合演算子 =>
標準 SQL による外部結合
Oracle 9i からサポートされた標準 SQL による記法の場合には LEFT [OUTER] JOIN、または、RIGHT [OUTER] JOIN と ON による結合因子(結合条件指定)によって結合を行なう。※ テーブルに対する条件は WHERE に別途記述する。
SELECT t1.key1, t1.name1, t2.name2
FROM table1 t1 LEFT OUTER JOIN table2 t2
ON t1.key = t2.key2
このとき、左に記述した table1 が核になる表である。コアになる表が左なのに何故「外部 = OUTER」というか
不思議に思った人は結構いるのではないだろうか?
これについては、結合処理の基本である ネステッドループ結合 における「外部表」と「内部表」の外部表という意味ではないかと思う。
(内部表は外部表のレコードのデータを元にして検索される)
ネステッドループ結合において「外部表=駆動表」を左にするか右にするかという指定であると理解しておくと良いだろう。
ただ、全外部結合 (FULL OUTER) になるとネステッドループとして成り立たなくなってしまうので確証が持てない。
同じ結果になる SQL を RIGHT OUTER JOIN で記述すると
SELECT t1.key1, t1.name1, t2.name2
FROM table2 t2 RIGHT OUTER JOIN table1 t1
ON t1.key = t2.key2
と記述できる。2つは異なる表記であるが実行計画に差異は発生しない。(しかし、2つの SQL は異なる ハッシュ値(Plan hash value) をもつのでカーソルを共有できず、個別に ハード解析 される)
Oracle 9i 以降であれば、標準 SQL の記法である 〜 OUTER JOIN をお勧めしたいところである。
しかし、現状ではサポート契約を結んでいない状態で、かつ、ターミナルリリースを用意できない環境で運用している
ケースは少なくない。あまりに先読みしすぎて現段階で無理にコーディング規約で全面的に禁止することや書き直しするなどしない方が幸せな選択になる場面もあるだろう。
(少なくとも Oracle 内部のビューがすべて標準 SQL に書き直されてリリースされるまでは…)
関連事項