SQLite | データの結合 | クロス結合(CROSS JOIN)

クロス結合は、2つのテーブルにある行のすべての組み合わせを取得します。ここでは、CROSS JOIN句の使い方を説明します。

クロス結合

クロス結合は、2つのテーブルにある行のすべての組み合わせを返します。

左側の各行に対して右側のすべての行を順番に組み合わせ、左側の全行について繰り返します。

cross_join

左側にn行、右側にm行ある場合、結果はn × m行になります。非常に大きな結果になる場合があるため注意してください。

CROSS JOIN句の使い方

SELECT文とCROSS JOIN句を組み合わせて、2つのテーブルをクロス結合できます。構文は次のとおりです。

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

簡略化すると次の形式になります。

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

ON句も指定できますが、通常CROSS JOINは結合条件なしで使うため、以降の例では省略します。

商品を登録するproductテーブルと色を登録するcolorテーブルを作成し、サンプルデータを追加します。

create table product (id integer, name text);

insert into product values (1, 'Desk');
insert into product values (2, 'Cabinet');
insert into product values (3, 'Chair');
sqlite> create table product (id integer, name text);
sqlite> 
sqlite> insert into product values (1, 'Desk');
sqlite> insert into product values (2, 'Cabinet');
sqlite> insert into product values (3, 'Chair');
sqlite> 
create table color (id integer, name text);

insert into color values (1, 'Red');
insert into color values (2, 'Blue');
insert into color values (3, 'White');
sqlite> create table color (id integer, name text);
sqlite> 
sqlite> insert into color values (1, 'Red');
sqlite> insert into color values (2, 'Blue');
sqlite> insert into color values (3, 'White');
sqlite> 

次のクロス結合を実行します。

select * from product cross join color;
sqlite> select * from product cross join color;
id          name        id          name      
----------  ----------  ----------  ----------
1           Desk        1           Red       
1           Desk        2           Blue      
1           Desk        3           White     
2           Cabinet     1           Red       
2           Cabinet     2           Blue      
2           Cabinet     3           White     
3           Chair       1           Red       
3           Chair       2           Blue      
3           Chair       3           White     
sqlite> 

productの各行とcolorのすべての行が組み合わされていることを確認できます。

取得するカラムを指定する

カラムの指定方法は内部結合と同じです。両方のテーブルに同名カラムがある場合はテーブル名.カラム名と記述し、一方だけにある名前はテーブル名を省略できます。

クロス結合でも実際にカラムを指定してみます。

select product.id, product.name, color.name from product cross join color;
sqlite> select product.id, product.name, color.name from product cross join color;
id          name        name      
----------  ----------  ----------
1           Desk        Red       
1           Desk        Blue      
1           Desk        White     
2           Cabinet     Red       
2           Cabinet     Blue      
2           Cabinet     White     
3           Chair       Red       
3           Chair       Blue      
3           Chair       White     
sqlite>