【SQL】マッピングテーブル上の自己結合
SQLには自己結合という、同じテーブル同士を結合するというテクニック(?)がありますが、
その用例を見てみると、
テーブル.従業員表
従業員番号 | 従業員名 | 上司 |
---|---|---|
135 | INAGAKI | 240 |
240 | KIMURA | NULL |
184 | KUSANAGI | 135 |
235 | KATORI | 240 |
こんな感じのテーブルから、
「従業員と上司の対応を番号ではなく名前で取得したい」
といったようなものが多く見受けられます。
ちなみにこんな感じです↓
SQL
SELECT A.従業員名 as 従業員名,B.従業員名 as 上司 FROM 従業員表 A,従業員表 B WHERE A.上司 = B.従業員番号 ;
結果
従業員名 | 上司 |
---|---|
INAGAKI | KIMURA |
KIMURA | NULL |
KUSANAGI | INAGAKI |
KATORI | KIMURA |
が、実は自己結合はこういう場合以外にも、
マッピングテーブル上で再帰的にサーチしたい場合にも使えます。
たとえばこんな感じ。
テーブル.売上明細
売上番号 | 商品番号 | 個数 |
---|---|---|
123 | 10001 | 1 |
123 | 20010 | 2 |
124 | 10001 | 10 |
124 | 30015 | 5 |
テーブル.商品マスタ
商品番号 | 商品名 |
---|---|
10001 | りんご |
20010 | バナナ |
30006 | ぶどう |
30015 | もも |
上記の売上明細テーブルは売上テーブルと商品テーブルを繋ぐマッピングテーブルで、
どの売上でどの商品がいくつ売れたのかを持っています。
そして、このテーブルから、
「商品番号20010(バナナ)と一緒に売れている商品は何か」
を取得したい場合などにも、自己結合が使えます。
SQL
SELECT S.商品名 FROM 商品マスタ S, 売上明細 U1, 売上明細 U2 WHERE U1.商品番号 = 20010 AND U1.売上番号 = U2.売上番号 AND U2.商品番号 <> U1.商品番号 AND U2.商品番号 = S.商品番号