本記事では、結合における分類であるクロス結合(直積・デカルト積・交差結合)について解説します。
クロス結合とは
クロス結合とは、結合するテーブル同士の全ての組み合わせのデータを取得する結合です。
基本的な使い方は以下になります。
-- テーブル1
A B
--- -
001 a
002 b
-- テーブル2
C D
--- -
001 z
003 w
-- クロス結合(ORACLE仕様)
SELECT t1.a
,t1.b
,t2.c
,t2.d
FROM test_table1 t1
,test_table2 t2
;
A B C D
--- - --- -
001 a 001 z
001 a 003 w
002 b 001 z
002 b 003 w
-- クロス結合(標準SQL規格(SQL99))
SELECT t1.a
,t1.b
,t2.c
,t2.d
FROM test_table1 t1
CROSS JOIN test_table2 t2
;
A B C D
--- - --- -
001 a 001 z
001 a 003 w
002 b 001 z
002 b 003 w
すべての結合の考え方の基本
クロス結合は、他の結合をイメージする際の基本となります。
例えば、条件が一致するデータを抽出する内部結合は、クロス結合した後に条件に一致するデータを抽出すると考えるとイメージしやすいのです。
-- テーブル1
A B
--- -
001 a
002 b
-- テーブル2
C D
--- -
001 z
003 w
-- 内部結合
SELECT t1.a
,t1.b
,t2.c
,t2.d
FROM test_table1 t1
,test_table2 t2
WHERE t1.a = t2.c
;
A B C D
--- - --- -
001 a 001 z ← 条件一致(抽出対象)
001 a 003 w ← 条件不一致
002 b 001 z ← 条件不一致
002 b 003 w ← 条件不一致
使い道
クロス結合は、実務で使用する場面はほとんどありません。
私自身も、レコード数が1行のテーブルのクロス結合(この場合、クロス結合と呼ぶのかは微妙ですが)以外では使用したことがありません。
ただ、パフォーマンステスト等のデータ増幅で利用することがあります。
-- テーブル1(3件)
A B
---- -
0001 A
0002 B
0003 C
-- テーブル2(10件)
Z
---
00
01
~
09
-- データ増幅(データを増幅しテーブル3に登録)
INSERT INTO test_table3
SELECT t2.z || SUBSTR(t1.a,3,2)
,t1.b
FROM test_table1 t1
,test_table2 t2
;
-- テーブル3(30件)
A B
---- -
0001 A
0002 B
0003 C
0101 A
0102 B
0103 C
0201 A
~
0903 C
誤ってクロス結合になってしまうことに注意
意図せず結合条件の記述が漏れていたことにより、クロス結合になってしまうミスがあるので注意が必要です。
2テーブルの結合や結合する項目が1つであれば漏れることは稀でしょうが、結合するテーブルや項目が多い場合、記述漏れしてしまいやすいです。
まとめ
テーブル同士を結合の分類であるクロス結合について見てきました。
クロス結合は、直接的に業務で使用することは少ないですが、他の結合をイメージする際の基本となります。
他の結合と合わせて、しっかりと理解しておきましょう。
関連





