SQL2005 Common Table Expressions(CET)即通用表表达式。

SQLSERVER CET递归使用案例:

1、普通案例

表结构如下:


 
;WITH cet_depart
AS
(
    SELECT depart_id, depart_name FROM dbo.Depart
    WHERE depart_id = '004'    --入口
    UNION ALL    --递归时必要
    SELECT d.depart_id, d.depart_name FROM  depart d INNER JOIN cet_depart c
    ON CAST (c.depart_id AS INT) = d.upper_depart_id  --递归条件
)
 
SELECT * FROM cet_depart
OPTION (MAXRECURSION 20)    --最大递归次数
 
结果集: 

 
2、经典实战

IF OBJECT_ID('Dept') IS NOT NULL     
  DROP TABLE Dept     
go
 
CREATE TABLE Dept (Id INT , ParentId INT , DeptName NVARCHAR(10))
   
 
INSERT Dept 
SELECT 1 ,   0 , N'食品'    
UNION ALL 
SELECT 2 ,   1 , N'水果'    
UNION ALL 
SELECT 3 ,   1 , N'蔬菜'    
UNION ALL 
SELECT 4 ,   2 , N'香蕉'    
UNION ALL 
SELECT 5 ,   2 , N'苹果'    
UNION ALL 
SELECT 6 ,   3 , N'青菜'        
UNION ALL 
SELECT 11 ,  0 , N'计算机'    
UNION ALL 
SELECT 12 , 11 , N'软件'    
UNION ALL 
SELECT 13 , 11 , N'硬件'    
UNION ALL 
SELECT 14 , 12 , N'Office'   
UNION ALL 
SELECT 15 , 12 , N'Emeditor'    
UNION ALL 
SELECT 16 , 13 , N'内存'    
 
--a.得到当前及所有子级 
--水果类
;WITH cte AS  (       
  SELECT Id,ParentId,DeptName FROM Dept WHERE id=2       
  UNION ALL
  SELECT a.Id,a.ParentId,a.DeptName FROM Dept a,cte b WHERE a.ParentId=b.Id
  
)    
SELECT * FROM cte   
-- Id          ParentId    DeptName   -- ----------- ----------- ----------   
-- 2           1           水果   
-- 4           2           香蕉   
-- 5           2           苹果  
--    
-- (3 行受影响)     
 
--b.得到当前及所有父级  
;WITH cte AS  (       
  SELECT Id,ParentId,DeptName FROM Dept WHERE id=16       
  UNION ALL      
  SELECT a.Id,a.ParentId,a.DeptName FROM Dept a,cte b WHERE a.Id=b.ParentId
  
)     
SELECT * FROM cte     
-- Id          ParentId    DeptName   -- ----------- ----------- ----------   
-- 16          13          内存   
-- 13          11          硬件   
-- 11          0           计算机   
--    
-- (3 行受影响)     
 
--c.得到所有路径   
;WITH cte AS  (       
  SELECT Id,ParentId,DeptName,Path=CAST(DeptName AS VARCHAR(MAX)) FROM Dept WHERE parentid=0
      
  UNION ALL      
  SELECT a.Id,a.ParentId,a.DeptName,CAST(b.Path +'/'+a.DeptName AS VARCHAR(MAX)) FROM Dept a,cte b WHERE a.ParentId=b.Id
  
)     
SELECT * FROM cte     
-- Id          ParentId    DeptName   Path   -- ----------- ----------- ---------- -------------------------   
-- 1           0           食品         食品   
-- 11          0           计算机       计算机   
-- 12          11          软件         计算机/软件   
-- 13          11          硬件         计算机/硬件   
-- 16          13          内存         计算机/硬件/内存   
-- 14          12          Office       计算机/软件/Office   
-- 15          12          Emeditor     计算机/软件/Emeditor  
 -- 2           1           水果         食品/水果   
-- 3           1           蔬菜         食品/蔬菜   
-- 6           3           青菜         食品/蔬菜/青菜   
-- 4           2           香蕉         食品/水果/香蕉   
-- 5           2           苹果         食品/水果/苹果   
--    
-- (12 行受影响)  

SQL Server CET 通用表表达式 之 精典递归的更多相关文章

  1. sql server使用公用表表达式CTE通过递归方式编写通用函数自动生成连续数字和日期

    问题:在数据库脚本开发中,有时需要生成一堆连续数字或者日期,例如yearly report就需要连续数字做年份,例如daily report就需要生成一定时间范围内的每一天日期.而自带的系统表mast ...

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

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

  3. sql server编写简洁四则运算表达式脚本实现计算批次功能(C#等其它编程语言也能直接用此通用表达式)

    问题: 在数据库编程开发中,有时会遇到数据量比较大的情况,如果直接大批量进行添加数据.修改数据.删除数据,就会是比较大的事务,事务日志也比较大,耗时久的话会对正常操作造成一定的阻塞.虽不至于达到删库跑 ...

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

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

  5. SQL Server温故系列(3):SQL 子查询 & 公用表表达式 CTE

    1.子查询 Subqueries 1.1.单行子查询 1.2.多行子查询 1.3.相关子查询 1.4.嵌套子查询 1.5.子查询小结及性能问题 2.公用表表达式 CTE 2.1.普通公用表表达式 2. ...

  6. sql server编写通用脚本自动统计各表数据量心得

    工作过程中,如果一个数据库的表比较多,手工编写统计脚本就会比较繁琐,于是摸索出自动生成各表统计数据量脚本的通用方法,直接上代码: /* 脚本来源:https://www.cnblogs.com/zha ...

  7. SQLServer中的CTE通用表表达式

    开发人员正在研发的许多项目都涉及编写由基本的 SELECT/FROM/WHERE 类型的语句派生而来的复杂 SQL 语句.其中一种情形是需要编写在 FROM 子句内使用派生表(也称为内联视图)的 Tr ...

  8. SQLServer中的CTE(Common Table Expression)通用表表达式使用详解

    概述 我们经常会编写由基本的 SELECT/FROM/WHERE 类型的语句派生而来的复杂 SQL 语句.其中一种方案是需要编写在 FROM 子句内使用派生表(也称为内联视图)的 Transact-S ...

  9. SQL Server 的通用分页显示存储过程

    建立一个 Web 应用,分页浏览功能必不可少.这个问题是数据库处理中十分常见的问题.经典的数据分页方法是:ADO 纪录集分页法,也就是利用ADO自带的分页功能(利用游标)来实现分页.但这种分页方法仅适 ...

随机推荐

  1. linux下的进程间通信之消息队列

    概念: 进程彼此之间可以通过IPC消息进行通信.进程产生的每条消息都被发送到一个IPC消息队列中,这条消息一直存放在队列中,直到另一个进程将其读走为止. 优点:可以通过发送消息来几乎完全避免命名管道的 ...

  2. 同时支持Android 和 ios 投屏到电脑的软件,Support Android and ios screen shrare to PC - 希沃授课助手

    最近学校由粉笔黑板更换了智慧电子黑板,然后发现了一个好玩的软件. 感谢希沃公司的开发: 希沃授课助手,这是一款同时支持Android 和 ios 投屏和远程控制的. 效果很流畅,非常赞

  3. 2019-11-8 Linux作业 李宗盛

    linux系统的特点:完全免费,高效,安全稳定.支持多种硬件平台.有好的用户界面.强大的网络功能.支持多任务多用户. linux一般有三个主要部分:内核.命令解释层.实用工具. 那合适系统的心脏,是运 ...

  4. Java面试 - PATH与CLASSPATH 的区别?

    PATH:操作系统提供的路径配置,用于定义所有可执行程序的路径. CLASSPATH:由JRE提供的,用于定义Java 程序解释时类加载路径.

  5. Word 双栏排版最后多一页空白页删不掉、左栏文字没写完就到右栏了

    1. 问题 问题:Word双栏排版,最后多一页空白页,删不掉.如图: 原因分析:删不掉是因为末尾文字处其实有个下一页分节符,只不过可能看不到. 如何清晰的看到? 视图 > 大纲,就可以看到了.如 ...

  6. C++Primer 5th Chap6 Functions

    局部静态变量,关键字static修饰,即使函数结束执行也不受影响,生存期直到程序终止. java中static的单一存储空间的概念与其或有异曲同工之妙. 函数的形参可以无名,但有名可以使其意义更加清晰 ...

  7. Python turtle(介绍一)

    关于绘制图形库turtle # 画布上,默认有一个坐标原点为画布中心的坐标轴(0,0),默认"standard"模式坐标原点上有一只面朝x轴正方向小乌龟 一:海龟箭头Turtle相 ...

  8. python学习-34 内置函数的补充

    其他内置函数 1.ord()    与chr()相反 2.pow() print(pow(3,3)) # 相当于3**3 print(pow(3,3,2)) # 相当于3*3%2 运行结果: 27 1 ...

  9. Gossip协议

    Gossip数据传播协议: Fabric通过将工作负载划分到事务执行(背书和提交)对等节点和事务排序节点,优化了区块链网络性能.安全性和可伸缩性.这种网络操作的解耦需要一个安全.可靠和可伸缩的数据传播 ...

  10. Python3 使用pygal 生成世界人口地图

    最近在看<python从入门到实践>,其中有一个例子是使用pygal制作世界人口地图,觉得挺有意思的,这里就记录下来了, 其实代码不是很复杂,使用环境环境python3.废话不多说,直接上 ...