!!!表結合 {{category Oracle,SQL,nolink}}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