自己結合

自己結合とはテーブルを自分自身のテーブルと結合することです。書式は次の通りです。

SELECT 別名1.カラム名, ...
 FROM テーブル名 別名1 INNER JOIN テーブル名 別名2
 ON 別名1.カラム名 = 別名2.カラム名;

同じテーブルで結合を行う為、テーブルを指定する時に別名を付けておきます。上記の場合は内部結合を行う時に自己結合をしている場合ですが、比較するカラム名の指定や取得するカラム名の指定には、テーブル名.カラム名とするかわりに別名.カラム名として指定します。

テーブルの結合

具体的な例で見てみます。次のようなテーブルを用意しました。

friends :

idnamefriendid
1安藤3
23
3小林4
4小早川1
5高橋4

この「friends」テーブルには「friendid」として友人の番号を表す数値が格納されています。この数値は同じ「friends」テーブルの「id」カラムの番号となっています。

「friends」テーブルのデータを取得する時に、友人の情報を数値ではなく名前で取得したかった場合には自己結合を行うことで可能となります。つまり「friends」テーブルの「friendid」カラムの値と「friends」テーブルの「id」カラムの値が一致するデータを取得し、「friends」カラムの値に一致する「friends」テーブルのデータの「name」カラムの値を取得します。

これを実現するには次のようなSELECT文を実行します。

select f1.name, f2.name from friends f1
 inner join friends f2 on f1.friendid = f2.id;

同じテーブルに対して2つの別名を付け、結合の時の比較するカラム名の指定や取得するカラム名を指定するために別名を使っています。

同じテーブルを対象に結合を行っているため少し分かりにくいですが、まったく同じデータと構造を持つ「friends2」テーブルを作成した上で次のように結合した場合と同じです。

select friends.name, friends2.name from friends
 inner join friends2 on friends.friendid = friends2.id;

自己結合を使えばわざわざ同じデータを持つテーブルを別に用意する必要はなくなります。

サンプル

では実際に試してみます。

次のようなテーブルを対象とします。

p5-1

自己結合でデータを取得します。

select f1.name, f2.name as friend from friends f1
 inner join friends f2 on f1.friendid = f2.id;

p5-2

取得するデータのカラム名が同じ「name」カラムのため、2つ目のカラムには別名を付けてデータを取得しました。