SQLのcross joinですべての組み合わせを表示するサンプルです。
目次
| 説明 | すべての組み合わせを表示(cross join) | 
| すべての組み合わせ+whereの条件をつける | 
すべての組み合わせを表示(cross join)
| 書き方1 (cross joinなし) select 項目 from テーブルA,テーブルB | 
| 書き方2 (cross joinあり) select 項目 from テーブルA cross join テーブルB | 
- from句にテーブルAとテーブルBを指定し、項目で結合しない場合、それぞれのテーブルの行のすべての組み合わせで抽出します。
 →テーブルAに3行あり、テーブルBに2行あった場合は、3*2=6行表示されます。
- cross joinを指定しても同じ結果になります。
- テーブルAまたはテーブルBにwhereで条件を指定することもできます。その場合、絞られた条件でのすべての組み合わせで抽出します。
- 直積またはデカルト積とも呼ばれます。
すべての組み合わせを表示するサンプル
以下、2つのテーブルがあるとします。
| id | name | romaji | 
|---|---|---|
| 1 | 鈴木 | suzuki | 
| 2 | 田中 | tanaka | 
| 3 | 佐藤 | sato | 
| id | name | 
|---|---|
| 2 | みかん | 
| 4 | りんご | 
上記テーブルに対して項目で結合しないでSQLを実行します。
select * from employee,
sales1行目と2行目にテーブルがありますが、項目で結合していません。
結果は、以下のとおりです。
| id | name | romaji | id_1 | name_1 | 
|---|---|---|---|---|
| 1 | 鈴木 | suzuki | 2 | みかん | 
| 2 | 田中 | tanaka | 2 | みかん | 
| 3 | 佐藤 | sato | 2 | みかん | 
| 1 | 鈴木 | suzuki | 4 | りんご | 
| 2 | 田中 | tanaka | 4 | りんご | 
| 3 | 佐藤 | sato | 4 | りんご | 
employeeテーブルとsaleテーブルの各行の組み合わせで抽出されます。
3*2=6行表示されます。
すべての組み合わせ+whereの条件をつける
すべての組み合わせ+whereの条件をつけるサンプルです。
以下、2つのテーブルがあるとします。
| id | name | romaji | 
|---|---|---|
| 1 | 鈴木 | suzuki | 
| 2 | 田中 | tanaka | 
| 3 | 佐藤 | sato | 
| id | name | 
|---|---|
| 2 | みかん | 
| 4 | りんご | 
上記テーブルに対してテーブルを項目で結合しない+whereの条件をつけて実行します。
select * from employee a,
sales b
where a.id in (2,3)
and b.id = 23,4行目は、それぞれのテーブルに条件をつけて絞っています。
結果は、以下のとおりです。
| id | name | romaji | id_1 | name_1 | 
|---|---|---|---|---|
| 2 | 田中 | tanaka | 2 | みかん | 
| 3 | 佐藤 | sato | 2 | みかん | 
whereで条件が絞られてからのemployeeテーブルとsaleテーブルの各行の組み合わせで抽出されます。
2*1=2行表示されます。
関連の記事
