読者です 読者をやめる 読者になる 読者になる

16bit!

エンジニアじゃなくなっちゃった人が何かを書くブログ

【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

参考:テーブルの結合_6.2.自己結合


が、実は自己結合はこういう場合以外にも、
マッピングテーブル上で再帰的にサーチしたい場合にも使えます。

たとえばこんな感じ。


テーブル.売上明細

売上番号 商品番号 個数
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.商品番号
結果
商品名
りんご

とまぁこんな感じ。

テーブル数が多いアプリケーションなんかではわりとこういうマッピングテーブルって多いのかなと思いますが、
自己結合すれば、SQL1本で「同じ親を持つ子」が取れるので、結構重宝します。


以上です。
はてな記法の「テーブル」を使ってみたかっただけとかいうのは内緒。