トップ 履歴 一覧 カテゴリ ソース 検索 ヘルプ RSS ログイン

Oracle/SqlJoin

INDEX

表結合

SQL99構文をサポートしているDBならJOIN句による結合は同じ構文が利用できる(FULL OUTER JOINは微妙だけど)。Where句に各書き方で、等価結合は大体どのDBでもいける。外部結合はどうだろう…。

SQL:1999構文を使用しての結合

SELECT 表名1.列名 , 表名2.列名 
FROM 表名1 
       {CROSS JOIN 表名2 }  
または {NATURAL JOIN 表名2 } 
または {JOIN 表名2 USING (列名) } 
または {JOIN 表名2 ON (表名1.列名 = 表名2.列名 ) } 
または {LEFT | RIGHT | FULL OUTER JOIN 表名2 ON (表名1.列名 = 表名2.列名 ) }  
; 
CROSS JOIN 表名2
2つの表から直積演算を戻します
NATURAL JOIN 表名2
2つの表の中の同じ列名に基づいて結合します
JOIN 表名2 USING (列名)
USING句の列名に基づいて等価結合をします
JOIN 表名2 ON (表名1.列名 = 表名2.列名)
ON句の条件に基づいて結合します
LEFT | RIGHT | FULL OUTER JOIN 表名2 ON (表名1.列名 = 表名2.列名 )
ON句の条件に基づいて外部結合をします

CROSS JOIN - クロス結合

CROSS JOIN句は、2つの表のクロス積(直積)を生成します。

SELECT  〜
FROM    表1 CROSS JOIN 表2
;

下記と等価になる

SELECT  〜
FROM    表1 , 表2
;

NATURAL JOIN - 自然結合

NATURAL JOIN句は、2つの表の同じ名前のすべての列に基づいて結合します。

SELECT  〜
FROM    表1 NATURAL JOIN 表2
;

下記と等価になる(表1と表2にIDのみ同じ列が存在する)

SELECT  〜
FROM    表1 , 表2
WHERE   表1.ID = 表2.ID
;

NATURAL JOIN句を使用した場合に何が良いかと言うと、「対応する表の列を明示的に指定しなくても良い」ということです。逆を返せば、「対応する表の列を正しく知らないと、どのように結合されるかがわからない」と言うことになります。

このように自然結合とは、名前とデータ型が一致するすべての列を使用して表を結合するものです。ただし、結合する表で同じ名前である列が異なるデータ型の場合には、エラーになる。

JOIN(USING) - USING句による等価結合

JOIN USING句は、2つの表にある同じ名前の列の内、指定した列で結合します。

SELECT  〜
FROM    表1
JOIN    表2 USING (ID)
;

下記と等価になる

SELECT  〜
FROM    表1 , 表2
WHERE   表1.ID = 表2.ID
;

NATURAL JOIN句と異なり結合を行う時の基となる列名を明示的に指定できる。そのため、同じ名前の列が存在しても指定していない列を基に結合されない。なので、結合に利用しない列ならば、名前が同じでデータ型が異なる場合でもエラーにならない。

NATURAL JOIN句とは排他利用となる。また、USING句に指定した列は表名などの修飾子を使用することは出来ない。

JOIN(ON) - ON句による等価結合

JOIN ON句は、2つの表にある任意の列で結合します。

SELECT  〜
FROM 表1
JOIN 表2 ON 表1.ID = 表2.NO
;

下記と等価になる

SELECT  〜
FROM    表1 , 表2
WHERE   表1.ID = 表2.NO
;

NATURAL JOIN や JOIN USING 句の場合、結合に利用する列は同じ名前である必要があるが、ON句は任意の列や条件を指定することが出来る。また、WHERE句に書く方法と比べると、結合条件が他の抽出条件から分離される。

複数の表を結合するときは以下のようにする。

SELECT  〜
FROM 表1
JOIN 表2 ON 表1.PID = 表2.PID
JOIN 表3 ON 表2.CID = 表2.CID
;

OUTER JOIN - 外部結合

参考資料

http://www.seshop.com/se/edu/shikaku/omo/miti/silver_miti.asp?educat=silver2

最終更新時間:2008年11月14日 15時40分00秒 指摘や意見などあればSandBoxのBBSへ。