クロス結合(直積・デカルト積)

ORACLE
20161225-1

本記事では、結合における分類であるクロス結合(直積・デカルト積・交差結合)について解説します。

スポンサーリンク

クロス結合とは

クロス結合とは、結合するテーブル同士の全ての組み合わせのデータを取得する結合です。

基本的な使い方は以下になります。

-- テーブル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つであれば漏れることは稀でしょうが、結合するテーブルや項目が多い場合、記述漏れしてしまいやすいです。

まとめ

テーブル同士を結合の分類であるクロス結合について見てきました。

クロス結合は、直接的に業務で使用することは少ないですが、他の結合をイメージする際の基本となります。

他の結合と合わせて、しっかりと理解しておきましょう。
関連




タイトルとURLをコピーしました