自己結合
自己結合とは新しい構文ではなく、内部結合や外部結合を使用する時に結合するテーブルが自分自身のテーブルの場合のことです。例として内部結合で自分自身を対象として結合する場合は次のようになります。
SELECT alias1.col_name, ... FROM tbl_name1 AS alias1 INNER JOIN tbl_name2 AS alias2 ON alias1.col_name1 = alias2.col_name2;
結合する対象の2つのテーブルが同じのため、結合条件を指定するためにそれぞれのテーブルに別名を設定し区別できるようにします。
テーブルの結合
具体的な例で見てみます。次のようなテーブルを用意しました。
node :
id | name | parent |
---|---|---|
1 | 和書 | NULL |
2 | 文学 | 1 |
3 | ビジネス | 1 |
4 | 文芸 | 2 |
5 | 歴史 | 2 |
6 | マーケティング | 3 |
7 | 経営戦略 | 3 |
このテーブルの「parent」カラムには同じテーブルの「id」カラムの値を格納しています。
ではテーブルからデータを取得します。この時、「parent」カラムの値をそのまま取得するのではなく、カラムの値に該当する名前を取得したデータを取得します。
SELECT f1.id, f1.name, f2.name FROM node AS f1 LEFT JOIN node AS f2 ON f1.parent = f2.id;
同じテーブルを結合するため、結合条件を指定するためにそれぞれのテーブルに別名を割り当て、あたかも別のテーブルであるかのように扱っています。
自己結合を使えばわざわざ同じデータを持つテーブルを別に用意する必要はなくなります。
サンプル
実際に試してみます。まず次のようなテーブルを作成します。
mysql> create table node (id int, name varchar(10), parent int);
テーブルには次のようなデータを追加してあります。
ではテーブルからデータを取得します。この時、「parent」カラムの値をそのまま取得するのではなく、カラムの値に該当する名前を取得したデータを取得します。
「goods」テーブルと「cate」テーブルを自然結合(左外部結合)します。2つのテーブルで共通のカラムは「id」カラムです。
mysql> select f1.id, f1.name, f2.name as parentname from node as f1 -> left join node as f2 on f1.parent = f2.id;
今回は取得するデータにも別名を設定し、分かりやすくしています。
( Written by Tatsuo Ikura )