摘要:本教程展示如何使用 SQL CROSS JOIN 创建联接表的笛卡尔积。
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;
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)中,可以使用条件为始终为 true 的 INNER JOIN
子句执行交叉联接,如下所示
SELECT
sales_org,
channel
FROM
sales_organization
INNER JOIN sales_channel ON 1 = 1;
Code language: SQL (Structured Query Language) (sql)
在本教程中,您了解了如何使用 SQL CROSS JOIN 子句来生成两个或更多表的笛卡尔积。