SQL 入門 > 外部結合

外部結合とは (OUTER JOIN)

外部結合とは、SQL において結合条件に対応するレコードがない場合にも指定した核となるテーブルからレコードが除外されない結合方法である。

2つのテーブルを結合してレコードを取得するときに、結合条件を除いた条件で一方のテーブルの条件を満たす レコードを常に取得したい要件に使用する。

例えば、「取引している会社一覧」に営業担当の社員を付して表示するとき
取引会社先一覧マスターと営業社員一覧マスターを結合して問い合わせしようとする。 このとき、新規開拓した取引先で営業担当が未決の場合に単なる結合では、新規の取引先が問い合わせ結果に含まれなくなる。もちろん表示しなくて良いということはなく、「営業担当:未決」として表示したいのが自然である。

行番号
L.No.
テーブル名
TABLE1
テーブル名
TABLE2
行番号
R.No.
項目名⇒NAME1KEY1KEY2NAME2
1A0011
--0022
2C003--
3D0043

外部結合演算子 (+)

上の表において 左のテーブル (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

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 に書き直されてリリースされるまでは…)



関連事項

 
スポンサード リンク

ITエンジニア キャリアアップ・転職・求人情報

■ フリーランスから独立開業、会社設立へ

■ 国内最大級の転職支援サービス

日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ OTN Software Kit (開発者ライセンス)
Google