SAK 図書館
SQL 表結合(join) - 単純結合、等価結合、非等価結合、外部結合、再帰結合
様々な連結テーブルが作成できるが、良く使うものはビュー(create view) に しておくと効率が良い。結合は、テーブルとテーブル、ビューとビュー、テーブ ルとビューなど複雑にできる。(テーブル連結) ■単純結合 ・現実的に単純結合を使う機会はないだろう。 次の例では、受注m の各レコードに 品番m の全レコードが結合される。 受注m のレコード数 x 品番m のレコード数の結果が問い合わされる。 select * from sak.受注m, sak.品番m ; ■等価結合 ・等価結合は、特定のキーで表を結合します。 条件のどちらかのデータが存在しない場合、結果セットには含まれません。 現実的には外部結合が一番使いやすいと思います。 select 受注番号, 受注m.品番 品番, 品番m.入庫数 入庫数 from sak.受注m, sak.品番m where 受注m.品番 = 品番m.品番 ; ・列の別名定義は、as を指定してもよい。 結合テーブルに同じ項目名が存在する場合は、どちらのテーブル項目か指定 するため、テーブル名で修飾する。(受注m.品番) select 受注番号, 受注m.品番 as 品番, 品番m.入庫数 as 入庫数 from sak.受注m, sak.品番m where 受注m.品番 = 品番m.品番 ; ・inner join を使用して、等価結合することもできます。(インナージョイン) select 受注番号, 受注m.品番 as 品番, 品番m.入庫数 as 入庫数 from sak.受注m inner join sak.品番m on 受注m.品番 = 品番m.品番 ; ・3 つ以上の結合を inner join で指定するには、次のようにする。 select * from (sak.受注m inner join sak.品番m on 受注m.品番 = 品番m.品番) inner join sak.得意先m on 受注m.得意先CD = 得意先m.得意先CD ; ■非等価結合 ・非常に時間のかかる結合ですが、必要な場面があるかもしれない。 なにがしかの範囲条件で結合する場合に使います。 select 受注番号, 受注m.品番 品番, 品番m.入庫数 入庫数 from sak.受注m, sak.品番m where 受注m.機種 like substr(品番m.機種, 1, 2) ; ■外部結合(外結合、行結合、行連結、テーブル結合、外部接合) ・外部結合は、一番よく使用します。 一方の条件に対するデータが存在しなかった場合でも片方のデータを結果セ ットに含める指定ができます。 次の例では、品番m にない品番の受注m レコードも結果に含まれます。 この場合、入庫数などの 品番m 項目には NULL がセットされて問い合わさ れます。Oracle では、left join、right join を (+) で指定できます。 (左結合、右結合、複数テーブル問い合わせ、複数テーブル参照) (複数問い合わせ、複合テーブル参照、レフトジョイン、ライトジョイン) select 受注番号, 受注m.品番 品番, 品番m.入庫数 入庫数 from sak.受注m, sak.品番m where 受注m.品番 = 品番m.品番 (+) ; select 受注番号, 受注m.品番 品番, 品番m.入庫数 入庫数 from sak.受注m left join sak.品番m on 受注m.品番 = 品番m.品番 ; ・逆に受注m にない品番の品番m レコードを結果に含ませることもできます。 現実的には、こういう結合に意味はありませんが、逆の和もできると言うこ とです。 select 受注番号, 受注m.品番 品番, 品番m.入庫数 入庫数 from sak.受注m, sak.品番m where 受注m.品番 (+) = 品番m.品番 ; select 受注番号, 受注m.品番 品番, 品番m.入庫数 入庫数 from sak.受注m right join sak.品番m on 受注m.品番 = 品番m.品番 ; ・三つ以上の表を結合することもできます。(3 テーブル結合) 次の例では、品番に対する品番m.入庫数、得意先CD に対する得意先m.得意 先名を結合しています。(left join を使用しても良い。) select 受注番号, 受注m.品番 品番, 品番m.入庫数 入庫数, 受注m.得意先CD 得意先CD, 得意先m.得意先名 得意先 from sak.受注m, sak.品番m, sak.得意先m where 受注m.品番 = 品番m.品番 (+) and 受注m.得意先CD = 得意先m.得意先CD (+) ; select 受注番号, 受注m.品番 品番, 品番m.入庫数 入庫数, 受注m.得意先CD 得意先CD, 得意先m.得意先名 得意先 from (sak.受注m left join sak.品番m on 受注m.品番 = 品番m.品番) left join sak.得意先m on 受注m.得意先CD = 得意先m.得意先CD ; ・複数の表を結合すると修飾が難解になりがちなので、テーブル別名を使うと 良いです。 select 受注番号, a.品番 品番, b.入庫数 入庫数, a.得意先CD 得意先CD, c.得意先名 得意先 from sak.受注m a, sak.品番m b, sak.得意先m c where a.品番 = b.品番 (+) and a.得意先CD = c.得意先CD (+) ; ** 外部結合を明示するために left join を left outer join、right join を right outer join と書くこともできる。 (アウタージョイン、レフトアウタージョイン、ライトアウタージョイン) ■再帰結合(内部結合) ・再帰結合は、同じテーブルをテーブル別名を使用して結合します。 次の例では、得意先m に親得意先CD があるとして、その得意先名を自分自 身と結合しています。(自己結合) select a.得意先CD 得意先CD, a.得意先名 得意先, a.親得意先CD 親得意先CD, b.得意先名 得意先 from sak.得意先m a, sak.得意先m b where a.得意先CD = b.親得意先CD (+) ; ■SQL 基礎実地編資料
■SQL 基礎編資料
■SQL チューニング編資料
■Oracle PL/SQL 編資料
■PostgreSQL 編、JAVA Servlet、JSP 編資料
■MySQL 編資料