关于SQLServer2005的学习笔记——临时表、表变量和CTE

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介:
SQLServer 临时表、表变量、 CTE
 
本文原本是为了说明游标在某些特定环境下的用途,突然发现用来说明临时表、表变量和 CTE 的关系更为合理一些。本文的例子给了一串数字,是为了求得同组中所有数字的乘积,包括累计叠加等等,这样的案例通过一般的分组方式很难办到,而通过游标更容易实现。
创建一个测试 表
CREATE TABLE groups
(
         groupid VARCHAR(10),
         val INT NULL
)
INSERT INTO groups VALUES ('a',2);
INSERT INTO groups VALUES ('a',3);
INSERT INTO groups VALUES ('a',1);
INSERT INTO groups VALUES ('b',4);
INSERT INTO groups VALUES ('b',6);
INSERT INTO groups VALUES ('b',1);
INSERT INTO groups VALUES ('c',10);
INSERT INTO groups VALUES ('c',3);
INSERT INTO groups VALUES ('d',7); 
 
通过临时表和游标的方法加以实现
CREATE TABLE #result (groupid VARCHAR(10),product BIGINT);
 
DECLARE @groupid VARCHAR(10),@prvgroupid VARCHAR(10),@val INT,@product BIGINT;
DECLARE c CURSOR FAST_FORWARD FOR SELECT groupid,val FROM groups ORDER BY groupid;
OPEN c;
FETCH NEXT FROM c INTO @groupid,@val;
SELECT @prvgroupid=@groupid,@product=1;
WHILE @@fetch_status=0
BEGIN
         IF @groupid<>@prvgroupid
         BEGIN
                   INSERT INTO #result VALUES(@prvgroupid,@product);
                   SELECT @prvgroupid=@groupid,@product=1;
         END
         SET @product=@product*@val;
         FETCH NEXT FROM c INTO @groupid,@val;
END
IF @prvgroupid IS NOT NULL
         INSERT INTO #result VALUES(@prvgroupid,@product);
CLOSE c;
DEALLOCATE c;
SELECT groupid,product FROM #result 
 
通过表变量和游标的方式加以实现,从这里看的话表变量和临时表基本雷同
DECLARE @groupid VARCHAR(10),@prvgroupid VARCHAR(10),@val INT,@product BIGINT;
DECLARE c CURSOR FAST_FORWARD FOR SELECT groupid,val FROM groups ORDER BY groupid;
OPEN c;
FETCH NEXT FROM c INTO @groupid,@val;
SELECT @prvgroupid=@groupid,@product=1;
WHILE @@fetch_status=0
BEGIN
         IF @groupid<>@prvgroupid
         BEGIN
           INSERT INTO #result VALUES(@prvgroupid,@product);
           SELECT @prvgroupid=@groupid,@product=1;
         END
         SET @product=@product*@val;
         FETCH NEXT FROM c INTO @groupid,@val;
         END
IF @prvgroupid IS NOT NULL
         INSERT INTO #result VALUES(@prvgroupid,@product);
CLOSE c;
DEALLOCATE c;
SELECT groupid,product FROM #result 
 
通过 CTE 的方式加以实现
WITH all_but_val AS
(
SELECT a.groupid,a.val*b.val accum_val
  FROM groups a,groups b
  WHERE a.groupid=b.groupid and a.val>b.val
),
but_val AS
(
SELECT * FROM groups
  WHERE groupid IN (SELECT groupid
  FROM groups
  GROUP BY groupid
HAVING COUNT(*)=1)
),
all_val AS
(
  SELECT * FROM all_but_val
  UNION
  SELECT * FROM but_val
)
SELECT groupid,max(accum_val) FROM all_val
  GROUP BY groupid 




本文转自baoqiangwang51CTO博客,原文链接:http://blog.51cto.com/baoqiangwang/310447 ,如需转载请自行联系原作者
相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
数据库
【学习笔记】Sqlserver/Mssql注入总结(三)
这是Sqlserver/Mssql注入总结的第三篇,将围绕布尔盲注入和一些特殊字符过滤的绕过进行讲述,有需要的可以考虑收藏保存,当做备忘录使用。
214 0
|
数据库
【学习笔记】Sqlserver/Mssql注入总结(二)
这是Sqlserver/Mssql注入总结的第二篇,将围绕报错注入进行讲述,有需要的可以考虑收藏保存,当做备忘录使用。
207 0
|
数据库
【学习笔记】Sqlserver/Mssql注入总结(一)
这是Sqlserver/Mssql注入总结的第一篇,将围绕union联合注入进行讲述,内容相对来说,比较中规中矩,有需要的可以考虑收藏保存,当做备忘录使用。
329 0
|
SQL
SQLServer 学习笔记之超详细基础SQL语句 Part 12(The End)
SQLServer 学习笔记之超详细基础SQL语句 Part 12(The End)
62 0
|
SQL Go
SQLServer 学习笔记之超详细基础SQL语句 Part 11
SQLServer 学习笔记之超详细基础SQL语句 Part 11
112 0
|
SQL 存储 Go
SQLServer 学习笔记之超详细基础SQL语句 Part 10
SQLServer 学习笔记之超详细基础SQL语句 Part 10
104 0
|
SQL Go 数据库
SQLServer 学习笔记之超详细基础SQL语句 Part 9
SQLServer 学习笔记之超详细基础SQL语句 Part 9
100 0
|
存储 SQL
SQLServer 学习笔记之超详细基础SQL语句 Part 8
SQLServer 学习笔记之超详细基础SQL语句 Part 8
73 0
|
存储 SQL 数据库
SQLServer 学习笔记之超详细基础SQL语句 Part 7
SQLServer 学习笔记之超详细基础SQL语句 Part 7
105 0
|
SQL Go 数据库
SQLServer 学习笔记之超详细基础SQL语句 Part 6
SQLServer 学习笔记之超详细基础SQL语句 Part 6
84 0