本教學將學習和演示如何使用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;
我們將建立兩個用於演示交叉連線的新表:
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
子句生成兩個或多個表的笛卡爾積。