SAK 図書館

SAK Streets メインストリート 図書館・カフェ 一覧 SAK Streets 検索
| VB | SQL | Perl | PHP | ASP | JSP | C | PC | HP | FAQ | フリーソフト |

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 編資料
| VB | SQL | Perl | PHP | ASP | JSP | C | PC | HP | FAQ | フリーソフト |

SAK Streets メインストリート 図書館・カフェ 一覧 SAK Streets 検索



Copyright (C) 1999-2024 Y.SAK