JavaScriptが無効になっています。
この状態では一部の情報が表示されず、すべての機能を利用することができません。
外部結合とは (OUTER JOIN)
外部結合とは、SQL において(通常の)結合条件の場合では対応するレコードがない場合にも指定した核となるテーブルからのレコードが除外されない結合方法である。
2つのテーブルを結合してレコードを取得するときに、結合条件を除いた条件で一方のテーブルの条件を満たすレコードを常に取得したい要件に使用する。
例えば、「取引している会社一覧」に営業担当の社員を付して表示するとき
取引会社先一覧マスターと営業社員一覧マスターを結合して問い合わせをしようとするだろう。
このときに新規開拓した取引先なので営業担当が未決定の場合に通常の結合では新規の取引先が問い合わせ結果に含まれなくなる。もちろん表示しなくて良いということはなく「営業担当:未決」として表示したいのが自然である。
外部結合演算子 (+)
下の表データにおいて 左のテーブル (TABLE1) はすべて残して、右のテーブル (TABLE2) と外部結合したい場合 の SQL は
SELECT t1.key1, t1.name1, t2.name2
FROM table1 t1, table2 t2
WHERE t1.key1 = t2.key2(+)
のように付帯したいテーブルの結合キーに (+) をつけることで外部結合される。
行番号 L.No. テーブル名 TABLE1 テーブル名 TABLE2 行番号 R.No. 項目名⇒ NAME1 KEY1 KEY2 NAME2 1 A 001 あ 1 - - 002 い 2 2 C 003 - - 3 D 004 う 3
関連事項 PL/SQL の 結合演算子 =>
標準 SQL による外部結合
Oracle 9i からサポートされた標準 SQL による記法の場合には LEFT [OUTER] JOIN 、または、RIGHT [OUTER] JOIN と ON による結合因子(結合条件指定)によって結合を行なう。※ テーブルに対する条件は WHERE に別途記述する。
(LEFT JOIN は LEFT OUTER JOIN の短縮形で同じ意味: RIGHT も同様)
SELECT t1.key1, t1.name1, t2.name2
FROM table1 t1 LEFT OUTER JOIN table2 t2
ON t1.key = t2.key2
このとき、左に記述した table1 が核になる表である。コアになる表が左なのに何故「外部 = OUTER」というか
不思議に思った人は結構いるのではないだろうか?
核の表こそ、内部(≒重要なものと勝手に脳内変換)なのではないのか?と思っていた事がある。
これについては、結合処理の基本である ネステッドループ結合 における「外部表」と「内部表」の外部表という意味ではないかと思う。
(内部表は外部表のレコードのデータを元にして検索される)
ネステッドループ結合において「外部表=駆動表」を左にするか右にするかという指定であると理解しておくと良いだろう。
ただ、全外部結合 (FULL OUTER) になるとネステッドループとして成り立たなくなってしまうので確証が持てない。
わき道のそれたが RIGHT OUTER JOIN で同じ意味の SQL を記述すると
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 に書き直されてリリースされるまでは…)
関連事項