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. Charles 教程

    本文介绍 charles 教程 - 代理抓包的使用方法 本文参考了:阿西河 Charles 教程 Charles Charles是一个HTTP代理/ HTTP监视器/反向代理,使开发人员能够查看其机器 ...

  2. Centos7之pacemaker高可用安装配置详解

    申明: centos7的pacemaker与6使用的方法不一致,即使用centos6.x的方法在centos7.x上面配置pacemaker不能成功. 因此openstack 上面的centos7.1 ...

  3. go基础系列 第一章 go基础语法

    0.前言 1. go定义变量的几种方式 2. go内建变量类型 3. 常量的定义 4. go枚举 5. go的if语句 零. go语言的换行 go语言对换行很有讲究, 如果想换行,必须有一个逗号, 否 ...

  4. el-table中通过renderHeader方法为表头添加hover等效果

    在我们的日常工作中有时候需要为element表格的表头进行自定义操作.在element官网中也有提到renderHeader方法.但是并未给出具体实现方法.现在具体说一下. 在element官网(ht ...

  5. AD域环境搭建

    1.安装Windows server服务器 我安装的是Windows server 2012 Standard x64 下载地址:https://pan.baidu.com/s/1dZ_B5JIEit ...

  6. wordPress设计网页实践

    我希望能设计出世界上最美的画面! 首先进入你自己建立的网站http://localhost:8079/Frank,如上图所示.注意,编辑页面时,要可以上外网,否则wordPress的插件会下载出错! ...

  7. JS将本地图片转化成base64码

    在图片上传的时候,有时候后台需要前台上传base64文件,这时候我们就需要将图片资源转化成base64,下面这段js代码就可实现此功能. 1.首先在html里定义一个input输入框: BASE64图 ...

  8. java多线程上篇(三) -- 进程通信和线程死锁简单介绍

    进程通信指的是进程间的信息交换 ,IPC(Inter-Process Communication,进程间通信) 进程通信就相当于一种工作方式.沟通形式,进程通信主要指的就是操作系统提供的进程通信工具( ...

  9. Spring IoC 详解(四)

    Spring IoC 概述 IoC:Inverse of Control(控制反转) 为了更好的理解用可以这样通俗易懂的这样讲:IOC主要是说是new一个类来使用,方式分为:开发这手动创建和Sprin ...

  10. TCP状态转换(图解+文字解说)

    <深入分析 javaweb 技术内幕>P38 读书扩展 作者:淮左白衣 写于2018年4月12日20:58:36 目录 TCP状态转换图解 图解三次握手 文字讲解三次握手: 图解四次挥手 ...