您的位置:首页 > 数据库

SQL笔记 - CTE递归实例:显示部门全称

2014-01-11 21:49 399 查看
昨天在整理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! ~\(≧▽≦)/~

参考:

/article/5298192.html

/article/4677374.html

/article/4740834.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: