SQL笔记 - CTE递归实例:显示部门全称
昨天在整理JS的Function时,示例是一个递归函数。说起递归,想起前段时间在搞CTE,那个纠结呀,看似容易,可我总抓不住门道,什么递归条件,什么结束条件,一头雾水。。。今天一大早就爬起来,果然不负有心人,顺利地完成,废话不多说。
场景: 有一个部门表:部门ID,部门名称,父部门ID,部门层次,需要显示部门的全名称(一级部门和二级部门直接显示,其余的格式:父部门名称+/本部门名称)

先做个测试,递归实现部门层次
-- To implement a Recursion using CTE
; -- Separate to other sentence
With CTE_Unit_Level -- test: show the level of every Unit
as(
select UnitID, UnitName, ParentUnitID, UnitLevel, 1 as ULevel
from Unit
where ParentUnitID = 0
Union All -- Essential
select U.UnitID, U.UnitName, U.ParentUnitID, U.UnitLevel,(CU.ULevel + 1) as ULevel
from Unit as U
Inner Join CTE_Unit_Level as CU
on U.ParentUnitID = CU.UnitID
)
-- show the result
select * from CTE_Unit_Level
结果完全一致:(这次竟然一下子就OK了,不可思议哦)

下面就是显示部门名称:可以用UnitName 累加,加就加呗, 但是需要设置下部门名称的类型。
;
With CTE_Unit_Name -- test: show the full name of every Unit
as(
select UnitID,
--UnitName,
Cast(UnitName as nvarchar(max)) as UnitName, --Essential!
ParentUnitID
from Unit
where ParentUnitID = 0
Union All -- Essential
select U.UnitID,
(
(
Case CU.ParentUnitID
When 0 Then ''
Else CU.UnitName + '/'
End
) + U.UnitName
) as UnitName,
U.ParentUnitID
from Unit as U
Inner Join CTE_Unit_Name as CU
on U.ParentUnitID = CU.UnitID
)
select * from CTE_Unit_Name
执行前,先插入个四级部门:
-- insert a unit of Level 4
insert into Unit
values('客服部', 8, 4)
结果:

------ Perfect! ~\(≧▽≦)/~
参考:
http://www.cnblogs.com/xfrog/archive/2010/10/10/1847462.html
http://www.cnblogs.com/CareySon/archive/2011/12/12/2284740.html
http://www.cnblogs.com/nokiaguy/archive/2009/01/31/1381562.html
SQL笔记 - CTE递归实例:显示部门全称的更多相关文章
- SQL笔记 - CTE递归实例(续):显示指定部门的全称
前一篇文章中已经可以取得所有部门的全称,但现在又有个新的需求: 只想得到某一个部门的部门全称,虽然可以用where条件来过滤,但是会有点小浪费. 这时我们可以从后往前找,先看下效果: 最后一条就是,行 ...
- Sql Server CTE递归
WITH cte AS ( SELECT a.FNUMBER,a.FMATERIALID AS MainId,b.FMATERIALID AS ChileID,CAST(b.FMATERIALID A ...
- KingbaseES的SQL语句-CTE递归
背景 从上下级关系表中,任意一个节点数据出发,可以获得该节点的上级或下级.CTE的递归语法,或者 connect by 与 start with的 查询语法,能够实现这个需求. 当我们需要制作上下级关 ...
- sql server CTE递归使用测试
--CTE递归查询 if(object_id(N'menu') > 0) drop table menu CREATE TABLE MENU ( name nvarchar(50) NOT NU ...
- SQL笔记 - 解决CTE定位点类型和递归部分的类型不匹配
在CTE递归测试,也就是部门名称拼接的时候,遇到了小问题: 登时就迷糊了:不都是取的是Unit表中的同一个列,相加之后类型就变了么? 难道是因为,系统知道这是在进行递归运算,但又不确定递归的层次,以及 ...
- SQL 递归查询,意淫CTE递归的执行步骤
今天用到了sql的递归查询.递归查询是CTE语句with xx as(....)实现的. 假如表Category数据如下. 我们想查找机枪这个子分类极其层次关系(通过子节点,查询所有层级节点).以下是 ...
- SQL Server利用递归把所有【子部门员工】汇总到【一级根节点部门】
前言 说起这个需求,有点反常规,左边是组织机构树,右边是组织机构对应的员工列表.点击左侧组织机构时传一个组织机构ID,然后查询该组织机构以及其所属的一级节点,如果有部门直属单击节点组织机构,则挂出来员 ...
- SQL Server中公用表表达式 CTE 递归的生成帮助数据,以及递归的典型应用
本文出处:http://www.cnblogs.com/wy123/p/5960825.html 我们在做开发的时候,有时候会需要一些帮助数据,必须需要连续的数字,连续间隔的时间点,连续的季度日期等等 ...
- SQL 笔记 By 华仔
-------------------------------------读书笔记------------------------------- 笔记1-徐 最常用的几种备份方法 笔记2-徐 收缩数据 ...
随机推荐
- 树莓派利用PuTTY进行远程登录
得到树莓派的IP:192.168.199.220 打开PuTTY: 端口为22 选择SSH 点击Open: 输入账号密码:pi/raspberry(注意,在linux下输入密码是看不见的) 如果要使用 ...
- ASP.NET MVC 给ViewBag赋值Html格式字符串的显示问题总结
今天再给自己总结一下,关于ViewBag赋值Html格式值,但是在web页显示不正常; 例如,ViewBag.Content = "<p>你好,我现在测试一个东西.</p& ...
- vi编辑文件出现Can't open file for writing错误
可以用 ll 命令查看一下文件的权限,很有可能是没有权限,用chmod命令修改一下权限就可以了(当然是文件所有者或者root用户才能修改),或者切换成root用户(不推荐)
- POJ - Til the Cows Come Home(Dijkstra)
题意: 有N个点,给出从a点到b点的距离,当然a和b是互相可以抵达的,问从1到n的最短距离 分析: 典型的模板题,但是一定要注意有重边,因此需要对输入数据加以判断,保存较短的边,这样才能正确使用模板. ...
- java语言:Linux与JVM的内存关系分
在一些物理内存为8g的服务器上,主要运行一个Java服务,系统内存分配如下:Java服务的JVM堆大小设置为6g,一个监控进程占用大约 600m,Linux自身使用大约800m.从表面上,物理内存应该 ...
- MooseFs-分布式文件系统系列(三)之MFSclient端的使用
Web界面监控MFS状态 mfscgiserv 是用python写的一个web服务器,监听端口是9425,必须在master(管理服务器上)上启动 常用的参数如下: | 参数| 作用| |:--| : ...
- JavaWeb---总结(五)Http协议
一.什么是HTTP协议 HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的 ...
- java内存配置
使用Java程序从数据库中查询大量的数据时出现异常:java.lang.OutOfMemoryError: Javaheap space 在JVM中如果98%的时间是用于GC且可用的 Heap siz ...
- Linux查看CPU和内存使用情况
在系统维护的过程中,随时可能有需要查看 CPU 使用率,并根据相应信息分析系统状况的需要.在 CentOS 中,可以通过 top 命令来查看 CPU 使用状况.运行 top 命令后,CPU 使用状态会 ...
- 阻塞式socket例子学习
/************************************************************************* > File Name: Win_Serve ...