CTE在SQL2005后的版本提供,丰富了查询的表现形式,下面我们慢慢来看下CTE都能干什么

  1、自我递归  

;WITH myaa AS
(
SELECT num=1 UNION
ALL
SELECT num=num+1 FROM myaa WHERE num<10
)
SELECT * FROM myaa
--OPTION (MAXRECURSION 0);--用于限制返回的层级,默认100

  2、打印字母表

  

;WITH myCTE AS
(
SELECT num=65,Mcharacter=CHAR(65)
UNION ALL
SELECT num=num+1,Mcharacter=CHAR(num+1) FROM myCTE WHERE num<90
)
--SELECT ','+Mcharacter FROM myCTE FOR XML PATH('')
SELECT STUFF((SELECT ','+Mcharacter FROM myCTE FOR XML PATH('')),1,1,'')

  

  3、实现Factorial

;WITH myCte AS
(
SELECT num=1,faccode=1
UNION ALL
SELECT num=num+1,faccode=(num+1)*faccode FROM myCte WHERE num<10
)
SELECT * FROM mycte

  看完上面有的朋友要说了,上面的全没什么用啊,废材,那下面我们来看一个比较有用的场景,相信很多朋友都不会陌生

  4、最最常用的场景

CREATE TABLE #t(id VARCHAR(20),pid VARCHAR(20),NAME VARCHAR(20))

INSERT INTO #t
SELECT '001',NULL,'广东省' UNION ALL
SELECT '002','001','广州市' UNION ALL
SELECT '003','001','深圳市' UNION ALL
SELECT '004','002','天河区' UNION ALL
SELECT '005','003','罗湖区' UNION ALL
SELECT '006','003','福田区' UNION ALL
SELECT '007','003','宝安区' UNION ALL
SELECT '008','007','西乡镇' UNION ALL
SELECT '009','007','龙华镇' UNION ALL
SELECT '010','007','松岗镇' ;WITH mycte AS
(
SELECT id,pid,NAME,levels=0 FROM #t WHERE id='007' --CTE
UNION ALL
-- 字段的选取同样重要
SELECT b.id,b.pid,b.NAME,levels=levels+1 FROM mycte a,#t b WHERE b.pid=a.id --通过CTE的ID与原始表的PID来匹配记录
)
SELECT * FROM mycte

  

  在这之前我短浅的认为CTE的用法就上面的这么几种,伴随着时间的推移我发现了它更广阔的使用场景,字符串处理、统计,它的身影可以说无处不在,在随后的备忘中我会贴出CTE在各个方面的使用。

  顺便提下,在CTE之前,写递归就没有这么简单了,下面写个之前我常用到的方式:

DECLARE @t_level table(id varchar(30),pid VARCHAR(30),NAME VARCHAR(30), level int)
DECLARE @id VARCHAR(10),@level INT
SET @id='007';
SET @level=1;
insert into @t_level select id,pid,name,@level FROM #t WHERE id=@id WHILE @@ROWCOUNT>0
BEGIN
SET @level=@level+1
INSERT INTO @t_level SELECT b.id,b.pid,b.name,@level FROM @t_level a INNER JOIN #t b on
b.pid=a.id AND a.level=@level-1
END
SELECT #t.* FROM #t,@t_level WHERE #t.id=[@t_level].id

  

CTE的使用的更多相关文章

  1. sql server 公共表达式的简单应用(cte)

    一.前言 现在做项目数据访问基本都会选择一种orm框架,它以面向对象的形式屏蔽底层的数据访问形式,让开发人员更集中在业务处理上,而不是和数据库的交互上,帮助我们提高开发效率:例如一些简单的insert ...

  2. 递归 CTE

    公用表表达式 (CTE) 具有一个重要的优点,那就是能够引用其自身,从而创建递归 CTE.递归 CTE 是一个重复执行初始 CTE 以返回数据子集直到获取完整结果集的公用表表达式. 当某个查询引用递归 ...

  3. CTE 递归查询

    使用CTE进行递归查询,能够实现对层次结构的数据的快速访问,非常有用. TSql CTE 递归原理探究 TSql 分层和递归查询 1,CTE的递归结构 递归查询的结构包括两部分:起始点和迭代公式. 使 ...

  4. Sql Server系列:通用表表达式CTE

    1 CTE语法WITH关键字 通用表表达式(Common Table Express, CTE),将派生表定义在查询的最前面.要使用CTE开始创建一个查询,可以使用WITH关键字. CTE语法: WI ...

  5. SQL Server中CTE的另一种递归方式-从底层向上递归

        SQL Server中的公共表表达式(Common Table Expression,CTE)提供了一种便利的方式使得我们进行递归查询.所谓递归查询方便对某个表进行不断的递归从而更加容易的获得 ...

  6. SQL Server中公用表表达式 CTE 递归的生成帮助数据,以及递归的典型应用

    本文出处:http://www.cnblogs.com/wy123/p/5960825.html 我们在做开发的时候,有时候会需要一些帮助数据,必须需要连续的数字,连续间隔的时间点,连续的季度日期等等 ...

  7. SQL Server 2008 R2——用CTE进行递归计算求解累计值

    =================================版权声明================================= 版权声明:原创文章 谢绝转载  请通过右侧公告中的“联系邮 ...

  8. 一次性事务和CTE插入数据的比较

    有时要构造一些数据来做测试数据,像下面这样: IF OBJECT_ID(N'T14') IS NOT NULL BEGIN DROP TABLE T14 END GO CREATE TABLE T14 ...

  9. 使用CTE减少统计子查询

    Set Statistics IO ON SET STATISTICS TIME ON --/*--原来语句 DECLARE @CkNo nvarchar(4000),@ProWarn int,@Sk ...

  10. with CTE AS

    CTE/表变量/Temp http://www.cnblogs.com/ziyeyimeng/articles/2366855.html

随机推荐

  1. Microsfot SQL Server 2012 日志收缩

    //Microsfot SQL Server 2012 日志收缩 USE DataBaseName;GO ALTER DATABASE DataBaseNameSET RECOVERY SIMPLE; ...

  2. oracle 对象权限 系统权限 角色权限

    系统权限: 允许用户执行特定的数据库动作,如创建表.创建索引.连接实例等 对象权限: 允许用户操纵一些特定的对象,如读取视图,可更新某些列.执行存储过程等 select * from user_sys ...

  3. X-Plosives

    uvaLive 3644:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&pa ...

  4. qt实现头像上传功能(朝十晚八的博客,一堆帖子)

    http://www.cnblogs.com/swarmbees/p/5688885.html

  5. TWinControl.SetBounds与TWinControl.UpdateBounds赏析(定义和调用)

    先看它们的函数内容: procedure TControl.SetBounds(ALeft, ATop, AWidth, AHeight: Integer); begin // 虚函数,TWinCon ...

  6. 【VS调试】C#读写Windows 7注册表时抛出“不允许所请求的注册表访问权”的解决办法

    原文:[VS调试]C#读写Windows 7注册表时抛出"不允许所请求的注册表访问权"的解决办法 项目 - 属性 - 安全性,"使用ClickOnce",修改a ...

  7. PlatformTransactionManager

    Spring Boot 使用事务非常简单,首先使用注解 @EnableTransactionManagement 开启事务支持后,然后在访问数据库的Service方法上添加注解 @Transactio ...

  8. 数学计数原理(Pólya):POJ 1286 Necklace of Beads

    Necklace of Beads Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7763   Accepted: 3247 ...

  9. 解决SQL Server管理器无法连接远程数据库Error: 1326错误

    解决SQL Server管理器无法连接远程数据库Error: 1326错误 我们在在使用SQL Server时都会遇到使用SQL Server Management Studio无法连接远程数据库实例 ...

  10. How To Create a New User and Grant Permissions in MySQL

    How to Create a New User Let’s start by making a new user within the MySQL shell: CREATE USER 'newus ...