同じテーブルを対象に結合する(自己結合)

内部結合や外部結合では通常複数のテーブルを結合しますが、自分自身のテーブルと結合をすることも可能です。このような結合を自己結合と呼んでいます。ここでは SQLite で自己結合の利用方法について解説します。

(Last modified: )

自己結合の使い方と利用方法

内部結合や外部結合を行う時に自分自身のテーブルと結合するのが自己結合です。自己結合では同じテーブル名を使用するためそれぞれに別の名前を付けて SQL を記述します。書式は次の通りです。

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

上記は内部結合の場合です。異なるテーブルを結合する場合と違い、 FROM の後と JOIN の後に記述するテーブルが同じテーブルとなります。ただ同じテーブルだと結合条件や取得するカラム名を記述する時に困りますので、同じテーブルではあるけれどそれぞれ別名を付けて区別できるようにします。(別名はどちらか1つのテーブルだけでも大丈夫なようです)。

-- --

それでは簡単な例を使ってどのように使用するのかについて確認します。次のようなテーブルを作成しました。

create table staff(id integer, name text, bossid integer);

自己結合の使い方と利用方法(1)

INSERT 文を使ってテーブルにデータをいくつか格納しておきます。

insert into staff values(1, 'Yamada', 3);
insert into staff values(2, 'Itou', 4);
insert into staff values(3, 'Suzuki', 5);
insert into staff values(4, 'Ueda', 3);
insert into staff values(5, 'Kuroda', 0);

自己結合の使い方と利用方法(2)

staff テーブルでは識別番号を表す id カラム、名前が格納されている name カラム、そして自分上司の識別番号を格納する bossid の 3 つのカラムがあります。上司も同じ staff テーブルに格納されており、 bossid カラムの値は staff テーブルの他のデータの id カラムの値が格納されています。

bossid の値を参照して上司の名前を結合したデータを取得したい場合、結合先のテーブルも同じ staff テーブルとなります。このような場合に自己結合を使用します。

では実際に同じテーブルを対象として外部結合し、データを取得してみます。

select person.id, person.name, boss.name from staff person
  left outer join staff boss
  on person.bossid = boss.id;

自己結合の使い方と利用方法(3)

同じテーブルを対象として外部結合をすることができました。取得するカラムを指定したり、 AS 句を使ってカラムに別名を付けることもできます。( AS 句については「取得データのカラムに別名を付ける(AS句)」を参照されてください)。

select person.id, person.name, boss.name as bossname
  from staff person
  left outer join staff boss
  on person.bossid = boss.id;

自己結合の使い方と利用方法(4)

今回は外部結合の場合で試してみましたが、内部結合の場合でも同じように使用することができます。

-- --

内部結合や外部結合で同じテーブルを結合する内部結合の使い方について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。