概要: このチュートリアルでは、SQL CROSS JOINを使用して、結合されたテーブルのデカルト積を作成する方法を説明します。
SQL CROSS JOIN句の紹介
クロス結合とは、2つ以上のテーブルのデカルト積を生成する結合操作です。
数学では、デカルト積は複数の集合の積集合を返す数学的演算です。
たとえば、2つの集合A {x,y,z}とB {1,2,3}の場合、A x Bのデカルト積は、すべての順序対(x,1)、(x,2)、(x,3)、(y,1)(y,2)、(y,3)、(z,1)、(z,2)、(z,3)の集合です。
次の図は、AとBのデカルト積を示しています。

同様に、SQLでは、2つのテーブルAとBのデカルト積は、最初のテーブル(A)の各行が2番目のテーブル(B)の各行とペアになっている結果セットです。 Aテーブルにn行、Bテーブルにm行あると仮定すると、AテーブルとBテーブルのクロス結合の結果はn x m行になります。
以下はCROSS JOIN句の構文を示しています。
SELECT column_list
FROM A
CROSS JOIN B;Code language: SQL (Structured Query Language) (sql)次の図は、テーブルAとテーブルBのクロス結合の結果を示しています。この図では、テーブルAには1、2、3の3行があり、テーブルBにもx、y、zの3行があります。その結果、デカルト積には9行あります。

INNER JOIN、LEFT JOIN、およびFULL OUTER JOINとは異なり、CROSS JOIN句には結合条件がないことに注意してください。
次のステートメントは、上記のCROSS JOIN句を使用するステートメントと同等です。
SELECT
column_list
FROM
A,
B;Code language: SQL (Structured Query Language) (sql)SQL CROSS JOINの例
クロス結合のデモンストレーションのために、2つの新しいテーブルを作成します。
-
sales_organizationテーブルは、販売組織を保存します。 -
sales_channelテーブルは、販売チャネルを保存します。
次のステートメントは、sales_organizationテーブルとsales_channelテーブルを作成します。
CREATE TABLE sales_organization (
sales_org_id INT PRIMARY KEY,
sales_org VARCHAR (255)
);Code language: SQL (Structured Query Language) (sql)CREATE TABLE sales_channel (
channel_id INT PRIMARY KEY,
channel VARCHAR (255)
);Code language: SQL (Structured Query Language) (sql)会社には、国内市場と国際市場での販売を担当する、DomesticとExportの2つの販売組織があると仮定します。
次のステートメントは、2つの販売組織をsales_organizationテーブルに挿入します。
INSERT INTO sales_organization (sales_org_id, sales_org)
VALUES
(1, 'Domestic'),
(2, 'Export');Code language: SQL (Structured Query Language) (sql)会社は、卸売、小売、eコマース、テレビショッピングなどのさまざまなチャネルを通じて商品を流通させることができます。次のステートメントは、販売チャネルをsales_channelテーブルに挿入します。
INSERT INTO sales_channel (channel_id, channel)
VALUES
(1, 'Wholesale'),
(2, 'Retail'),
(3, 'eCommerce'),
(4, 'TV Shopping');Code language: SQL (Structured Query Language) (sql)販売組織が持つ可能性のあるすべての販売チャネルを見つけるには、次のようにCROSS JOINを使用してsales_organizationテーブルをsales_channelテーブルと結合します。
SELECT
sales_org,
channel
FROM
sales_organization
CROSS JOIN sales_channel;
Code language: SQL (Structured Query Language) (sql)以下は結果セットです。

結果セットには、sales_organizationテーブルとsales_channelテーブルの可能なすべての行が含まれています。
次のクエリは、上記のCROSS JOIN句を使用するステートメントと同等です。
SELECT
sales_org,
channel
FROM
sales_organization,
sales_channel;Code language: SQL (Structured Query Language) (sql)PostgreSQLやOracleなどの一部のデータベースシステムでは、常にtrueと評価される条件付きでINNER JOIN句を使用することで、次のようなクロス結合を実行できます。
SELECT
sales_org,
channel
FROM
sales_organization
INNER JOIN sales_channel ON 1 = 1;Code language: SQL (Structured Query Language) (sql)このチュートリアルでは、SQL CROSS JOIN句を使用して、2つ以上のテーブルのデカルト積を生成する方法を学びました。