交差結合(CROSS JOIN句)

広告

2つのテーブルを結合してデータを取得する方法の中で、2つのテーブルのデータの全ての組み合わせを取得する方法が交差結合です。ここでは交差結合を行うためのCROSS JOIN句の使い方について解説します。

1.CROSS JOIN句の使い方
2.データの結合方法
3.取得するデータのカラム指定方法

CROSS JOIN句を使うための書式は次の通りです。

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

長いので簡略化すると次のようになります。

SELECT (取得するカラム) FROM テーブル名1 CROSS JOIN テーブル名2 ON (結合条件);

ON句も指定できますがCROSS JOIN句では結合条件を指定せずに使用するケースが多いのではないかと思いますので以下の解説でも結合条件は省略して解説します。

交差結合は2つのテーブルのデータの全ての組み合わせです。例えばテーブル1に「A」「B」「C」というデータがあり、テーブル2に「a」「b」というデータがあった場合、交差結合の結果は「Aa」「Ab」「Ba」「Bb」「Ca」「Cb」となり全部で3×2=6つのデータになります。

それでは簡単な例を使ってどのように使用するのかについて確認します。製品の一覧が登録された「product」テーブルと、色が登録された「color」テーブルを用意しました。

create table product(id integer, name text, colorid integer);
create table color(id integer, name text);

p3-1

productテーブルには次のようなデータが入っています。

p3-2

colorテーブルには次のようなデータが入っています。

p3-3

では次のように交差結合し、データを取得してみます。

select * from product cross join color;

p3-4

productテーブルのデータ1つ1つに対してcolorテーブルのデータを1つずつ結合したデータを取得することができました。

先ほどのサンプルを元にどのようにテーブルが外部結合(CROSS JOIN句)されるのかについて確認していきます。まずSELECT文の最初に記述されたテーブルの1つ目のデータに対して結合が行われます。

id name        colorid
-----------------------
1  Tablet      1

このデータに対してcolorテーブルの全てのデータとそれぞれ結合して1つのデータとして返します。

id name        colorid   id  name
----------------------------------
1  Tablet      1         1   Black
1  Tablet      1         2   Red
1  Tablet      1         3   White

productテーブルのデータを順番に同じように結合していきます。最後まで同じ手順で結合したら終了です。最終的に取得できるデータは次の通りです。

id name        colorid   id  name
----------------------------------
1  Tablet      1         1   Black
1  Tablet      1         2   Red
1  Tablet      1         3   White
2  Printer     3         1   Black
2  Printer     3         2   Red
2  Printer     3         3   White
3  Mobile Pho  2         1   Black
3  Mobile Pho  2         2   Red
3  Mobile Pho  2         2   White
4  Mouse       3         1   Black
4  Mouse       3         2   Red
4  Mouse       3         3   White

これは先ほど実際に試した結果と一致します。交差結合でも結合条件を指定できますが、内部結合の場合と結果は変わらなり使われることはあまりないかと思いますので省略します。

取得するデータのカラム指定方法は内部結合の場合と同じです。詳細は「取得するデータのカラム指定方法」を参照されて下さい。2つのテーブルで同じカラム名がある場合は「テーブル名.カラム名」のように指定し、どちらかのテーブルにしかないカラム名の場合はテーブル名を省略して「カラム名」で指定します。

交差結合の場合も実際に試しておきます。

select product.id, product.name, color.name from product cross join color;

p3-5

カラムを指定して交差結合したテーブルからデータを取得することができました。

( Written by Tatsuo Ikura )