SQL CROSS JOIN

摘要:本教學將說明如何使用 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。因此,笛卡爾積有九列。

SQL CROSS JOIN

請注意,與 INNER JOINLEFT JOINFULL 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_organizationsales_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)

假設公司有兩個銷售組織,分別是 DomesticExport,負責國內和國際市場的銷售。

以下陳述式會插入兩個銷售組織到 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 JOINsales_organization 表格與 sales_channel 表格聯結,如下所示

SELECT
	sales_org,
	channel
FROM
	sales_organization
CROSS JOIN sales_channel; 
Code language: SQL (Structured Query Language) (sql)

以下是結果集

SQL CROSS JOIN example

結果集包含 sales_organizationsales_channel 表格中的所有可能列。

以下查詢等同於上面使用 CROSS JOIN 子句的陳述式

SELECT
	sales_org,
	channel
FROM
	sales_organization,
	sales_channel;Code language: SQL (Structured Query Language) (sql)

在某些資料庫系統(例如 PostgreSQLOracle)中,您可以使用 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 子句來產生兩個或多個表格的笛卡爾積。

這個教學對您有幫助嗎?