当前位置:Gxlcms > 数据库问题 > 高级T-SQL进阶系列 (一):使用 CROSS JOIN 介绍高级T-SQL

高级T-SQL进阶系列 (一):使用 CROSS JOIN 介绍高级T-SQL

时间:2021-07-01 10:21:17 帮助过:6人阅读

* FROM A CROSS JOIN B

注意当使用CROSS JOIN操作符时,没有像你使用INNER,OUTER JOIN 那样,有一个JOIN子句来连接两张表。

你应该意识到使用CROSS JOIN 操作符会产生很大的数据集合。为了浏览这种行为让我们看看两个不同的示例,看看从一个CROSS JOIN产生的数据集会多么的巨大。对于第一个示例我们假设你会交叉连接两个表,其中表A具有10行而表B具有3行,那么结果集合便会具有10*3行或者说是30行。对于第二个示例我们假定表A具有1000万条数据而表B具有300万条数据。那么表A和表B的CROSS JOIN 产生的结果集会有多少条数据呢?那会产生高达30,000,000,000,000条数据。那是许多行并且它会占用SQL SERVER大量的时间和资源来创建结果集。因此当在大的记录集合上使用CROSS JOIN操作符时,你需要特别小心。

让我们通过几个示例来更近一点查看CROSS JOIN 操作符。

使用CROSS JOIN操作符的基本示例

对于第一组示例我们将连接连个示例表。列表1的代码用来创建这两个示例表。确保你在一个用户数据库上执行此脚本而不是在master库上。

CREATE TABLE Product (ID int, 
                      ProductName varchar(100),
                      Cost money);
CREATE TABLE SalesItem (ID int, 
                        SalesDate datetime, 
                        ProductID int, 
                        Qty int, 
                        TotalSalesAmt money);
INSERT INTO Product 
    VALUES (1,Widget,21.99),
           (2,Thingamajig,5.38), 
           (3,Watchamacallit,1.96);
INSERT INTO SalesItem
    VALUES (1,2014-10-1,1,1,21.99),
           (2,2014-10-2,3,1,1.96),
           (3,2014-10-3,3,10,19.60),
           (4,2014-10-3,1,2,43.98),
           (5,2014-10-3,1,2,43.98); 

 列表1 CROSS JOIN的测试表

对于第一个CROSS JOIN 示例,我们将运行列表2的代码。
 

SELECT * FROM 
Product CROSS JOIN SalesItem;

  列表2:简单的CROSS JOIN示例

当我们在SSMS窗口运行列表2的代码时,在我的结果窗口我们得到了报告1的输出:

ID  ProductName           Cost     ID   SalesDate               ProductID Qty  TotalSalesAmt
--- --------------------- -------- ---- ----------------------- --------- ---- ---------------
1    Widget               21.99    1    2014-10-01 00:00:00.000 1         1    21.99
1    Widget               21.99    2    2014-10-02 00:00:00.000 3         1    1.96
1    Widget               21.99    3    2014-10-03 00:00:00.000 3         10   19.60
1    Widget               21.99    4    2014-10-03 00:00:00.000 1         2    43.98
1    Widget               21.99    5    2014-10-03 00:00:00.000 1         2    43.98
2    Thingamajig          5.38     1    2014-10-01 00:00:00.000 1         1    21.99
2    Thingamajig          5.38     2    2014-10-02 00:00:00.000 3         1    1.96
2    Thingamajig          5.38     3    2014-10-03 00:00:00.000 3         10   19.60
2    Thingamajig          5.38     4    2014-10-03 00:00:00.000 1         2    43.98
2    Thingamajig          5.38     5    2014-10-03 00:00:00.000 1         2    43.98
3    Watchamacallit       1.96     1    2014-10-01 00:00:00.000 1         1    21.99
3    Watchamacallit       1.96     2    2014-10-02 00:00:00.000 3         1    1.96
3    Watchamacallit       1.96     3    2014-10-03 00:00:00.000 3         10   19.60
3    Watchamacallit       1.96     4    2014-10-03 00:00:00.000 1         2    43.98
3    Watchamacallit       1.96     5    2014-10-03 00:00:00.000 1         2    43.98

报告1:当运行列表2的结果

如果你查看报告1的结果你将会发现会有15条不同的记录。前5条记录包含了列值,是从Product表的第一行与SalesItem 表的5条不同的记录进行连接。同样对于Product表的第二行与第三行也是如此。最终返回的总行数是Product表的行数乘以SalesItem 表的行数,也就是15。

 

高级T-SQL进阶系列 (一):使用 CROSS JOIN 介绍高级T-SQL

标签:高达   span   帮助   笛卡尔积   个数   nsa   serve   air   tair   

人气教程排行