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. python选课系统demo的小练习

    #简化选课系统代码:先登陆,然后判断身份并实例化,根据身份对应的类,让用户选择 class Manager: operate_dict=[ ('创造学生账号',"creat_student& ...

  2. Node express post 大小设置

    body-parser 默认限制了body长度 var bodyParser = require('body-parser'); app.use(bodyParser.json({"limi ...

  3. JavaScript form提交汉字乱码

    <script type="text/javascript"> var test1="http://www.w3school.com.cn/My first/ ...

  4. 日常工作问题解决:rhel7下使用teamd配置双网卡绑定

    目录 1.情景描述 2.准备工作 2.1 确认网卡信息 2.2 删除原有网卡配置信息 3.配置网卡绑定 3.1 配置千兆网卡双网卡热备用作心跳 3.2 配置网兆网卡双网卡负载均衡用作业务 1.情景描述 ...

  5. 日常工作问题解决:配置NTP服务器以及一些常见错误解决

    1.配置NTP服务端 环境:redhat 6.5 服务器主机名 ip地址 说明 server 192.168.57.20 NTP服务端 client 192.168.57.21 NTP客户端 搭建说明 ...

  6. 表单绑定 v-model

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  7. EasyUI 对话框弹出文件输入框

    目前用的EasyUI的dialog,要实现弹出文件输入框(或者其他输入框和对话框),我的实现方案是,首先写一个close的div,然后里面就是样式和输入框的一些代码和一个确定按钮,然后页面上一个按钮, ...

  8. python 正则 re模块(详细版)

    正则表达式 什么是正则表达式? 正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合 ...

  9. python标准库之collections介绍

    collections----容器数据类型 collections模块包含了除list.dict.和tuple之外的容器数据类型,如counter.defaultdict.deque.namedtup ...

  10. PAT(B) 1018 锤子剪刀布(C:20分,Java:18分)

    题目链接:1018 锤子剪刀布 分析 用一个二维数组保存两人所有回合的手势 甲乙的胜,平,负的次数刚好相反,用3个变量表示就可以 手势单独保存在signs[3]中,注意顺序.题目原文:如果解不唯一,则 ...