1. 導入:CROSS JOINが必要な理由
データベース開発において、テーブル同士を結合する際は通常「INNER JOIN」や「LEFT JOIN」といった、特定の条件(キー)に基づく結合を多用します。しかし、実務では「すべての組み合わせを網羅したい」というニーズが発生することがあります。例えば、在庫管理システムで「全製品」×「全サイズ」の組み合わせマスタを生成したり、シミュレーション用のテストデータを大量に作成したりする場面です。この記事では、SQLiteを例に、すべての組み合わせを網羅する「CROSS JOIN」の仕組みと注意点を解説します。
2. 基礎知識:交差結合とは
交差結合(CROSS JOIN)とは、2つのテーブルのレコードを「総当たり」で組み合わせる結合手法です。数学の集合論における「直積(デカルト積)」と同じ概念です。
例えば、テーブルAに3行、テーブルBに3行のデータがある場合、CROSS JOINを実行すると結果は「3 × 3 = 9行」となります。この性質から、テーブルの行数が増えると爆発的にデータ量が増加するため、実行時には注意が必要です。
3. 実装:CROSS JOINの基本構文
CROSS JOINは、他の結合と異なり、基本的に結合条件(ON句)を指定しません。すべての行を組み合わせるため、単純な構文で記述可能です。
基本構文:
SELECT FROM テーブルA CROSS JOIN テーブルB;
もし、特定のカラムだけを抽出したい場合は、内部結合と同様にテーブル名を明示します。
SELECT A.id, A.name, B.color FROM テーブルA CROSS JOIN テーブルB;
4. サンプルプログラム:製品とカラーの総当たりリスト作成
以下のコードは、製品テーブルと色テーブルをCROSS JOINし、すべての製品バリエーションを作成する実用的な例です。
— 1. 準備:製品テーブルと色テーブルの作成
CREATE TABLE product(id INTEGER, name TEXT);
CREATE TABLE color(id INTEGER, name TEXT);
— 2. サンプルデータの投入
INSERT INTO product VALUES(1, ‘デスク’), (2, ‘チェア’);
INSERT INTO color VALUES(1, ‘赤’), (2, ‘青’);
— 3. CROSS JOINの実行
— すべての製品と色の組み合わせを取得します
SELECT
product.name AS 製品名,
color.name AS 色
FROM product
CROSS JOIN color;
— 実行結果のイメージ:
— デスク | 赤
— デスク | 青
— チェア | 赤
— チェア | 青
5. 応用・注意点:現場での落とし穴
実務でCROSS JOINを使う際に、最も気を付けるべきは「データの爆発」です。
・意図しないデータ量の増加
数万件のレコードを持つテーブル同士をCROSS JOINすると、計算上は数億件以上のレコードが生成されます。これはデータベースのメモリを圧迫し、クエリがタイムアウトする主原因となります。CROSS JOINを実行する前には、必ず対象テーブルの行数を確認してください。
・ON句の必要性
参考資料にもある通り、ON句を指定することも可能です。しかし、これは実質的にINNER JOINと同じ結果になります。実務上の意図と異なる結果を招く可能性があるため、条件付きで結合したい場合は、明示的にINNER JOINを使用し、CROSS JOINは「全組み合わせが必要な時のみ」限定して使用することを推奨します。
・テストデータの作成に活用
CROSS JOINの最も安全で有効な活用法は、開発・検証環境でのテストデータ作成です。大量のダミーデータを短時間で生成できるため、パフォーマンス検証時の負荷テストなどで積極的に活用してみてください。

コメント