摘要:本教學將說明如何使用 SQL CROSS JOIN 來建立所聯結表格的笛卡爾積。
SQL CROSS JOIN 子句簡介
交叉聯結 (cross join) 是一種聯結操作,會產生兩個或多個表格的笛卡爾積。
在數學中,笛卡爾積是一種數學運算,會傳回多個集合的乘積集合。
例如,對於兩個集合 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 中,兩個表格 A 和 B 的笛卡爾積是一個結果集,其中第一個表格 (A) 中的每一列都會與第二個表格 (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,表格 B 也有三列 x、y 和 z。因此,笛卡爾積有九列。

請注意,與 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 範例
我們將建立兩個新的表格來示範交叉聯結
-
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
,負責國內和國際市場的銷售。
以下陳述式會插入兩個銷售組織到 sales_organization
表格中
INSERT INTO sales_organization (sales_org_id, sales_org)
VALUES
(1, 'Domestic'),
(2, 'Export');
Code language: SQL (Structured Query Language) (sql)
公司可以透過各種通路(例如批發、零售、電子商務和電視購物)來銷售商品。以下陳述式會插入銷售通路到 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)中,您可以使用 INNER JOIN
子句,其條件永遠評估為 true 來執行交叉聯結,例如
SELECT
sales_org,
channel
FROM
sales_organization
INNER JOIN sales_channel ON 1 = 1;
Code language: SQL (Structured Query Language) (sql)
在本教學中,您已學習如何使用 SQL CROSS JOIN 子句來產生兩個或多個表格的笛卡爾積。