SQL CROSS JOIN

摘要:本教程展示如何使用 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。结果是,笛卡尔积有九行

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)中,可以使用条件为始终为 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 子句来生成两个或更多表的笛卡尔积。

本教程是否有帮助?