交差結合

交差結合はそれぞれのテーブルのデータの全ての組み合わせのデータを取得する場合に使います。基本となる構文は次の通りです。

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

ON句も指定できますがCROSS JOIN句を使用する場合は省略されることが多いのではと思います。

交差結合の場合、元になるテーブルのデータ1行に対してもう一つのテーブルのデータをそれぞれ結合したデータを取得します。これが元のテーブルのデータ分だけ行われるため取得するデータの総数はそれぞれのテーブルのデータ数を乗算した結果となります。

テーブルの結合

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

goods :

codecateidname
B00111Q84
D0012ドロップ
B0021植物図鑑

cate :

idname
1和書
2DVD
3スポーツ

次のように交差結合を行います。

select * from goods cross join cate;

データの取得は次のように行われます。まず「goods」テーブルの最初のデータに対して「cate」テーブルの全てのデータとそれぞれ結合させたデータを取得します。

goods.codegoods.cateidgoods.namecate.idcate.name
B00111Q841和書
B00111Q842DVD
B00111Q843スポーツ

同じように「goods」テーブルのデータに対して順に結合を行っていきデータを取得します。

結果的に次のようなデータが取得されます。

goods.codegoods.cateidgoods.namecate.idcate.name
B00111Q841和書
B00111Q842DVD
B00111Q843スポーツ
D0012ドロップ1和書
D0012ドロップ2DVD
D0012ドロップ3スポーツ
B0021植物図鑑1和書
B0021植物図鑑2DVD
B0021植物図鑑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」と指定する必要があります。

サンプル

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

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

p3-1

p3-2

「goods」テーブルと「cate」テーブルを交差結合してデータを取得します。

select * from goods cross join cate;

p3-3

なお交差結合であってもON句を指定することができます。

select * from goods cross join cate on goods.cateid = cate.id;

p3-4

このようにすると内部結合と変わりがなくなります。