SQL Cross Join子句


本教學將學習和演示如何使用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)

下圖說明了AB的笛卡爾積:

類似地,在SQL中,兩個表AB的笛卡爾乘積是結果集,其中第一個表(A)中的每一行與第二個表(B)中的每一行配對。 假設A表有n行,而B表有m行,那麼AB表的交叉連線結果有n x m行。

以下是CROSS JOIN子句的語法:

SELECT column_list
FROM A
CROSS JOIN B;

下圖說明了表A和表B之間的交叉連線的結果。在圖中,表A具有三行記錄:1,23,而表B也具有三行記錄:xyz。 那麼笛卡爾積結果有九行:

注意,與INNER JOINLEFT JOINFULL OUTER JOIN不同,CROSS JOIN子句沒有連線條件。

以下語句等同於使用上面的CROSS JOIN子句的語句:

SELECT 
    column_list
FROM
    A,
    B;

2. SQL CROSS JOIN範例

我們將建立兩個用於演示交叉連線的新表:

  • sales_organization表儲存銷售組織。
  • sales_channel表儲存銷售渠道。

以下語句用於建立sales_organizationsales_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 JOINsales_organnel表與sales_channel表連線,如下所示:

SELECT
    sales_org,
    channel
FROM
    sales_organization
CROSS JOIN sales_channel;

執行上面查詢語句,得到以下結果 -

結果集包括sales_organizationsales_channel表中的所有行記錄。

以下查詢等效於使用上面的CROSS JOIN子句的語句:

SELECT
    sales_org,
    channel
FROM
    sales_organization,
    sales_channel;

在某些資料庫系統(如PostgreSQLOracle)中,可以使用INNER JOIN子句,其條件始終求值為true以執行交叉連線,例如:

SELECT
    sales_org,
    channel
FROM
    sales_organization
INNER JOIN sales_channel ON 1 = 1;

在本教學中,學習了如何使用SQL CROSS JOIN子句生成兩個或多個表的笛卡爾積。