FROM での結合条件の表記 Oracle 9i

純粋な条件(=WHERE)とテーブル間の結合因子(=ON) を区別しようとするための記述
結合テーブルが増たとき、WHERE が結合条件だらけで条件自体の存在が希薄になることを防いでくれる。(+)での制限事項もない。
9i からサポートされたANSIでの結合表記方法。

オラクルは(+)演算子に制限事項があることにより、こちらを推奨しています。
参照: 外部結合演算子の制限事項

  • 一般形
SELECT 〜
  FROM TBL1 INNER JOIN TBL2
       ON TBL1.COL1 = TBL2.COL1
  • カラム名が同じ場合限定
SELECT 〜
  FROM TBL1 INNER JOIN TBL2
       USING ( COL1 )

(注意1) USING()を使用すると、そのカラム名を修飾して使うことができない。

(例) SELECT  COL1, TBL1.COL2, TBL2.COL3 FROM 〜 USING ( COL1 ) 〜

(注意2)異なる型同士をUSINGで結合すると暗黙変換が行われる。(NATURALでも同じ)
INNNER の場合は 右表の属性と値、LEFTの場合には左表の属性と値、RIGHTの場合には右表の属性と値 FULL OUTERの場合にはエラーとなる。(10g R1)
カラム名の修飾が許されていないので、おかしな動作の原因となるので使わない方がよい。

  • テーブルが3つ
SELECT 〜
FROM (
    TBL1 INNER JOIN TBL2
    ON TBL1.COL1 = TBL2.COL1
) 
INNER JOIN TBL3
    ON TBL1.COL1 = TBL3.COL1
  • WHERE にも一応記述はできるぞ(意味ないし…)
SELECT 〜
FROM TBL1 INNER JOIN TBL2
     ON 1 = 1
WHERE
   TBL1.COL1 = TBL2.COL1

結合の種類

FROM table1 [NATURAL] [{ INNER | RIGHT | LEFT | FULL | CROSS ] }] JOIN table2

内部結合 INNER

2つのテーブルを特定の項目で組み合わせ(=ON 〜、USING 〜)、双方に存在するレコードだけが結果セットとなる。

左外部結合 LEFT [OUTER]

左に記述したテーブルは全て残します。これに右のテーブルと特定の項目で組み合わせ、右のテーブルに組み合うレコードがある場合には、その全てと組み合わせを行います。(右テーブルに該当レコードが無い場合にはNULLを補います)

右外部結合 RIGHT [OUTER]

右に記述したテーブルは全てのレコード残します。これに左のテーブルと特定の項目で組み合わせ、左のテーブルに組み合うレコードがある場合には、その全てと組み合わせを行います。(左テーブルに該当レコードが無い場合にはNULLを補います)

全外部結合 FULL [OUTER]

左右とも全レコードを残します。特定の項目で組み合わせて組み合うレコード同士は一緒のレコードにします。(一方に組み合うレコードが無い場合にはNULLを補います)

※ FULL OUTERはこの記述方法でしか実現できない。
   Oracle固有の(+)の記法を使用して FULL OUTER は記述できない。

交差結合 CROSS

左の1レコードと右の全レコードを組み合わせる結合を左の全レコードに対して行います。結果は左のレコード数×右のレコード数になります。テストデータを全組み合わせで作成する場合に使うくらいでしか見たことはありません)

自然結合 NATURAL

限定的な等結合 結合のルール(=USING)は名前だけで行われる。
そのため、テーブル間で同一名であり暗黙変換行えない型の場合エラーになる。
暗黙変換が行われた場合、右のテーブルの型と値が使用される。
USING、ONは使えない。(NATURALは使用せず、JOINで全て結合条件を書くことをお勧めする)

NATURAL [ INNER | LEFT | RIGHT | FULL ] JOIN


ANSI SQLの関連トピックス

日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ Oracle Web セミナー