Sql简介 专题
专题目录
您的位置:database > Sql简介专题 > SQL Cross Join子句
SQL Cross Join子句
作者:--    发布时间:2019-11-20

本教程将学习和演示如何使用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子句生成两个或多个表的笛卡尔积。


网站声明:
本站部分内容来自网络,如您发现本站内容
侵害到您的利益,请联系本站管理员处理。
联系站长
373515719@qq.com
关于本站:
编程参考手册