本教程將學習和演示如何使用SQL CROSS JOIN生成連接表的笛卡爾積。
1. SQL 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;
下圖說明瞭表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;
2. SQL CROSS JOIN示例
我們將創建兩個用於演示交叉連接的新表:
sales_organization表存儲銷售組織。sales_channel表存儲銷售管道。
以下語句用於創建sales_organization和sales_channel表:
-- 創建表1
CREATE TABLE sales_organization (
sales_org_id INT PRIMARY KEY,
sales_org VARCHAR (255)
);
-- 創建表2
CREATE TABLE sales_channel (
channel_id INT PRIMARY KEY,
channel VARCHAR (255)
);
假設該公司有兩個國內(Domestic)和出口(Export)銷售組織,負責國內和國際市場的銷售。
以下語句將兩個銷售組織插入sales_organization表:
INSERT INTO sales_organization (sales_org_id, sales_org)
VALUES
(1, 'Domestic'),
(2, 'Export');
該公司可以通過批發(Wholesale),零售(Retail),電子商務(eCommerce)和電視購物(TV Shopping)等各種管道分銷商品。 以下語句將銷售管道插入sales_channel表:
INSERT INTO sales_channel (channel_id, channel)
VALUES
(1, 'Wholesale'),
(2, 'Retail'),
(3, 'eCommerce'),
(4, 'TV Shopping');
要查找銷售組織可以擁有的所有可能的銷售管道,可以使用CROSS JOIN將sales_organnel表與sales_channel表連接,如下所示:
SELECT
sales_org,
channel
FROM
sales_organization
CROSS JOIN sales_channel;
執行上面查詢語句,得到以下結果 -

結果集包括sales_organization和sales_channel表中的所有行記錄。
以下查詢等效於使用上面的CROSS JOIN子句的語句:
SELECT
sales_org,
channel
FROM
sales_organization,
sales_channel;
在某些資料庫系統(如PostgreSQL和Oracle)中,可以使用INNER JOIN子句,其條件始終求值為true以執行交叉連接,例如:
SELECT
sales_org,
channel
FROM
sales_organization
INNER JOIN sales_channel ON 1 = 1;
在本教學中,學習了如何使用SQL CROSS JOIN子句生成兩個或多個表的笛卡爾積。
