Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

CROSS JOIN

2つのテーブルのすべての行の組み合わせ(直積)を生成する結合です。結合条件を指定しないため、左テーブルのm行と右テーブルのn行から m×n 行の結果を返します。

構文
-- CROSS JOIN で全組み合わせを生成します。
SELECT 列名, ...
FROM テーブル1
CROSS JOIN テーブル2;

-- カンマ区切りでも同じ結果になります(旧来の書き方)。
SELECT 列名, ...
FROM テーブル1, テーブル2;
構文一覧
構文概要
CROSS JOIN2つのテーブルの全行の組み合わせ(直積)を返します。
FROM t1, t2カンマ区切りで複数テーブルを指定すると、WHERE句なしでは CROSS JOIN と同じ結果になります。
サンプルコード
-- 商品テーブルとカラーテーブルのすべての組み合わせを生成します。
SELECT
    s.商品名,
    c.カラー
FROM 商品 AS s
CROSS JOIN カラー AS c;

-- 曜日テーブルと時間帯テーブルを組み合わせてシフト表の枠を生成します。
SELECT
    y.曜日,
    t.時間帯
FROM 曜日 AS y
CROSS JOIN 時間帯 AS t
ORDER BY y.曜日ID, t.時間帯ID;
実行結果
-- 商品(3行)× カラー(4行)= 12行が返ります。
商品名     | カラー
-----------+--------
Tシャツ    | レッド
Tシャツ    | ブルー
Tシャツ    | グリーン
Tシャツ    | ホワイト
パーカー   | レッド
パーカー   | ブルー
パーカー   | グリーン
パーカー   | ホワイト
ジャケット | レッド
ジャケット | ブルー
ジャケット | グリーン
ジャケット | ホワイト
データベース別の書き方

『CROSS JOIN』の構文は主要なデータベースで共通して使用できます。

-- MySQL・PostgreSQL・SQL Server・Oracle・SQLite 共通
SELECT s.商品名, c.カラー
FROM 商品 AS s
CROSS JOIN カラー AS c;

Oracle では従来のカンマ区切り構文(『FROM テーブル1, テーブル2』)も広く使われています。動作は『CROSS JOIN』と同じですが、意図を明確にするために『CROSS JOIN』と明示するのが推奨されています。

概要

『CROSS JOIN』は結合条件を持たない結合で、左テーブルの各行に対して右テーブルのすべての行を組み合わせます。結果の行数は「左テーブルの行数 × 右テーブルの行数」になります。

主な用途はカレンダー生成・シフト表の枠作成・サイズとカラーの組み合わせ一覧など、意図的に全組み合わせが必要な場面です。大きなテーブル同士で使うと行数が爆発的に増えるため、件数を事前に確認してから実行してください。

結合の基本については『INNER JOIN』を、同じテーブルを自分自身と結合する方法は『SELF JOIN』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。