设为首页 加入收藏

TOP

高级T-SQL级别1的Stairway:使用CROSS JOIN引入高级T-SQL分析(一)
2018-05-08 06:06:53 】 浏览:37
Tags:高级 T-SQL 级别 Stairway: 使用 CROSS JOIN 引入 T-SQL分析

高级T-SQL级别1的Stairway:使用CROSS JOIN引入高级T-SQL

这是将探索TransactSQL (TSQL)更高级特性的新Stairway系列的第一篇文章。这个Stairway将包含一系列的文章,这些文章将扩展到您在前两个TSQL stairways中学习的TSQL基础上:

T-SQL DML的Stairway

T-SQL的Stairway:超越基础。

这个“高级TransactSQL”Stairway将涵盖以下TSQL主题:

CREOSS JOIN的使用

APPLY 的使用

理解公共表表达式(CTE)

使用Transact-SQL游标记录级别处理。

使用PIVOT将数据转向其一侧。

使用UNPIVOT将列变为行。

使用排序函数排序数据。

使用函数管理日期和时间。

了解以OVER的变化。

这个Stairway的读者应该已经很好地理解了如何从SQL Server表中查询、更新、插入和删除数据。此外,他们还应该掌握可以用来控制TSQL代码流的方法的工作知识,并且能够测试和操作数据。

这个Stairway应该帮助读者准备通过微软认证考试70-461:查询微软SQL Server 2012。

对于这个新的Stairway系列的第一部分,我将讨论CROSSJOIN操作符。

CROSS JOIN操作符介绍。

CROSS JOIN操作符可以用来将一个数据集中的所有记录合并到另一个数据集中的所有记录中。

下面是一个使用CROSSJOIN操作符来连接两个表a和B的简单示例:

SELECT * FROM A CROSS JOIN B

注意,当使用CROSSJOIN操作符时,没有连接子句连接两个表,就像在两个表之间执行内部和外部连接操作时使用的连接子句。

您需要注意的是,使用CROSSJOIN可以生成一个大型记录集。为了探究这种行为,让我们看看两个不同的示例,看看结果集的大小如何来自于CROSS JOIN操作。对于第一个示例,假设您是CROSS JOIN两个表,其中表A有10行,表B有3行。CROSS JOIN的结果集将是10乘以3或30行。对于第二个示例,假设表A有1,000万行,表B有300万行。在表a和B之间的CROSS JOIN结果中有多少行那将是一个巨大的30万亿的行。这是很多行,需要很多时间和大量的资源来创建这个结果集,所以在大型记录集上使用CROSS JOIN操作符时需要非常小心。

让我们通过几个例子来进一步了解使用CROSS JOIN操作符。

使用CROSSJOIN的基本示例

在前面的几个例子中,我们将连接两个示例表。清单1中的代码将用于创建这两个示例表。确保在用户数据数据库中运行这些脚本,而不是在master中运行。

CREATE TABLE Product (ID int,

ProductName varchar(100),

Costmoney);

CREATE TABLE SalesItem (ID int,

SalesDate datetime,

ProductID int,

Qtyint,

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的示例表。

对于第一个CROSSJION示例,我将运行清单2中的代码。

SELECT * FROM

Product CROSS JOIN SalesItem;

清单2:简单CROSS JOIN示例。

当我在SQL ServerManagement Studio窗口中运行清单2中的代码时,使用会话设置来输出结果的文本,我得到了报告1中的输出:

ID ProductName Cost IDSalesDate ProductIDQty TotalSalesAmt

--- --------------------- -------- ---- -------------------------------- ---- ---------------

1 Widget 21.99 12014-10-01 00:00:00.000 11 21.99

1 Widget 21.99 22014-10-02 00:00:00.000 31 1.96

1 Widget 21.99 32014-10-03 00:00:00.000 310 19.60

1 Widget 21.99 42014-10-03 00:00:00.000 12 43.98

1 Widget 21.99 52014-10-03 00:00:00.000 12 43.98

2 Thingamajig 5.381 2014-10-01 00:00:00.000 1 121.99

2 Thingamajig 5.38 22014-10-02 00:00:00.000 31 1.96

2 Thingamajig 5.38 32014-10-03 00:00:00.000 310 19.60

2 Thingamajig 5.38 42014-10-03 00:00:00.000 12 43.98

2 Thingamajig 5.38 52014-10-03 00:00:00.000 12 43.98

3 Watchamacallit 1.961 2014-10-01 00:00:00.0001 1 21.99

3 Watchamacallit 1.962 2014-10-02 00:00:00.0003 1 1.96

3 Watchamacallit 1.963 2014-10-03 00:00:00.0003 10 19.60

3 Watchamacallit 1.964 2014-10-03 00:00:00.0001 2 43.98

3 Watchamacallit 1.965 2014-10-03 00:00:00.000 1 243.98

报告1:运行清单2的结果

如果您查看报告1中的结果,您可以看到有15个不同的记录。这些前5个记录包含产品表的第一行与SalesItem表中的5个不同行连接的列值。产品表的2秒和3行也是如此。返回的行数是Product表中的行数乘以SalesItem表中的行数,即15行。

创建Cartesian产品可能有用的一个原因是生成测试数据。假设我想在我的产品和SalesItem表中使用日期生成一些不同的产品。我可以使用CROSS JOIN来实现,如清单3所示:

SELECT ROW_NUMBER() OVER(ORDER BY ProductName DESC) AS ID,

Product.ProductName

+ CAST(SalesItem.ID as varchar(2)) ASProductName,

(Product.Cost /SalesItem.ID) * 100 AS Cost

FROM Product CROSS JOIN SalesItem;

我可以使用交叉连接来做到这种效果,就像我在清单3做到的那样。

清单3:简单的交
编程开发网

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇win10系统下安装mysql8.0.11全过程 下一篇select结果不带抬头实现

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

最新文章

热门文章

C 语言

C++基础

windows编程基础

linux编程基础

C/C++面试题目