交差結合
交差結合はそれぞれのテーブルのデータの全ての組み合わせのデータを取得する場合に使います。基本となる構文は次の通りです。
SELECT テーブル名.カラム名, ... FROM テーブル名1 CROSS JOIN テーブル名2 ON テーブル名1.カラム名1 = テーブル名2.カラム名2;
ON句も指定できますがCROSS JOIN句を使用する場合は省略されることが多いのではと思います。
交差結合の場合、元になるテーブルのデータ1行に対してもう一つのテーブルのデータをそれぞれ結合したデータを取得します。これが元のテーブルのデータ分だけ行われるため取得するデータの総数はそれぞれのテーブルのデータ数を乗算した結果となります。
テーブルの結合
具体的な例で見てみます。次のような2つのテーブルを用意しました。
goods :
| code | cateid | name |
|---|---|---|
| B001 | 1 | 1Q84 |
| D001 | 2 | ドロップ |
| B002 | 1 | 植物図鑑 |
cate :
| id | name |
|---|---|
| 1 | 和書 |
| 2 | DVD |
| 3 | スポーツ |
次のように交差結合を行います。
select * from goods cross join cate;
データの取得は次のように行われます。まず「goods」テーブルの最初のデータに対して「cate」テーブルの全てのデータとそれぞれ結合させたデータを取得します。
| goods.code | goods.cateid | goods.name | cate.id | cate.name |
|---|---|---|---|---|
| B001 | 1 | 1Q84 | 1 | 和書 |
| B001 | 1 | 1Q84 | 2 | DVD |
| B001 | 1 | 1Q84 | 3 | スポーツ |
同じように「goods」テーブルのデータに対して順に結合を行っていきデータを取得します。
結果的に次のようなデータが取得されます。
| goods.code | goods.cateid | goods.name | cate.id | cate.name |
|---|---|---|---|---|
| B001 | 1 | 1Q84 | 1 | 和書 |
| B001 | 1 | 1Q84 | 2 | DVD |
| B001 | 1 | 1Q84 | 3 | スポーツ |
| D001 | 2 | ドロップ | 1 | 和書 |
| D001 | 2 | ドロップ | 2 | DVD |
| D001 | 2 | ドロップ | 3 | スポーツ |
| B002 | 1 | 植物図鑑 | 1 | 和書 |
| B002 | 1 | 植物図鑑 | 2 | DVD |
| B002 | 1 | 植物図鑑 | 3 | スポーツ |
結合されたデータには各テーブルに存在していたカラムが全て含まれることになります。
取得するカラムの指定方法
結合された全データの中で、どのカラムを取得するかはSELECT文の後ろで指定します。カラムは「テーブル名.カラム名」の形式で指定して下さい。例えば「goods」テーブルの「code」カラムと「cate」テーブルの「name」カラムの値を取得するには次のように記述します。
select goods.code, cate.name from goods
cross join cate on goods.cateid = cate.id;
どちらかのテーブルにしか存在しないカラムを指定する場合はテーブル名を省略できます。例えば「goods」テーブルの「code」カラムを取得したい場合、「cate」テーブルには「code」カラムは存在しませんので単に「code」と記載できます。
select code, cate.name from goods
cross join cate on goods.cateid = cate.id;
それに対して「goods」テーブルの「name」カラムを取得したい場合には「cate」テーブルにも「name」カラムが存在するので必ずテーブル名を付けて「goods.name」と指定する必要があります。
サンプル
では実際に試してみます。
次のようなテーブルを対象とします。
「goods」テーブルと「cate」テーブルを交差結合してデータを取得します。
select * from goods cross join cate;
なお交差結合であってもON句を指定することができます。
select * from goods cross join cate on goods.cateid = cate.id;
このようにすると内部結合と変わりがなくなります。