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

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

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

TABLE Cust (Id int, CustName varchar(20)); CREATE TABLE Sales (Id int identity ,CustID int ,SaleDate date ,SalesAmt money); SET NOCOUNT ON; DECLARE @I int = 0; DECLARE @Date date; WHILE @I < 1000 BEGIN SET @I = @I + 1; SET @Date = DATEADD(mm, -2, 2014-11-01); INSERT INTO Cust VALUES (@I, Customer # + right(cast(@I+100000 as varchar(6)),5)); WHILE @Date < 2014-11-01 BEGIN IF @I%7 > 0 INSERT INTO Sales (CustID, SaleDate, SalesAmt) VALUES (@I, @Date, 10.00); SET @Date = DATEADD(DD, 1, @Date); END END

列表7:用来创建性能测试数据示例的TSQL

列表7的代码为1000个不同的客户创建了2个月的数据。这段代码为每第七个用户不插入销售记录。这段代码为Cust表插入了1000条记录,并且为Sales 表插入了52,338 条记录。

为了演示使用CROSS JOIN操作符依赖于输入数据集大小会有如何的不同,让我们运行列表8和列表9的代码,对于每一个测试我会记录下它们返回结果所需要的时间。

SELECT CONVERT(CHAR(6),S1.SaleDate,112) AS SalesMonth, C.CustName, 
       ISNULL(SUM(S2.SalesAmt),0) AS TotalSales
FROM Cust C
CROSS JOIN  
(
SELECT SaleDate FROM Sales 
) AS S1
LEFT OUTER JOIN 
Sales  S2
ON C.ID = S2.CustID
AND S1.SaleDate = S2.SaleDate
GROUP BY CONVERT(CHAR(6),S1.SaleDate,112),C.CustName
HAVING ISNULL(SUM(S2.SalesAmt),0) = 0
ORDER BY CONVERT(CHAR(6),S1.SaleDate,112),C.CustName

列表8:所有记录的CROSS JOIN

SELECT CONVERT(CHAR(6),S1.SaleDate,112) AS SalesMonth, C.CustName, 
       ISNULL(SUM(S2.SalesAmt),0) AS TotalSales
FROM Cust C
CROSS JOIN  
(
SELECT DISTINCT SaleDate FROM Sales 
) AS S1
LEFT OUTER JOIN 
Sales  S2
ON C.ID = S2.CustID
AND S1.SaleDate = S2.SaleDate
GROUP BY CONVERT(CHAR(6),S1.SaleDate,112),C.CustName
HAVING ISNULL(SUM(S2.SalesAmt),0) = 0
ORDER BY CONVERT(CHAR(6),S1.SaleDate,112),C.CustName

列表9:去重销售日期记录的CROSS JOIN

在列表8中,CROSS JOIN操作符将1000条Cust表记录和52,338条Sales表记录进行关联用来产生52,338,000行的数据集合,这些记录随后用来决定在一个月中具有0条销售记录的客户。在列表9中,我改变了查询条件,从Sales表中仅仅返回SalesDate值的去重集合。这个去重的集合仅仅产生了61条不同的SalesDate值,因此列表9的CROSS JOIN操作符仅仅产生了61,000条记录。通过减少CROSS JOIN操作符的结果集,我的列表9的查询运行了少于1秒的时间,同时

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

标签:最小化   tin   结果   问题   varchar   values   创建   有一个   ros   

人气教程排行