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 編資料