SQL SERVER 2005之前的版本只能用函数方法实现,SQL SERVER 2005之后新增了CTE功能,可以利用CTE实现递归查询;

  CTE:公用表达式Common Table Expression 是SQL SERVER 2005版本之后引入的一个特性;

#填充测试数据

1、sql

 Create table GroupInfo([Id] int,[GroupName] nvarchar(50),[ParentGroupId] int)

 Insert GroupInfo

 select 0,'某某大学',null union all

 select 1,'外语学院',0 union all
select 2,'英语专业',1 union all
select 3,'日语专业',1 union all
select 4,'英语专业一班',2 union all
select 5,'英语专业二班',2 union all
select 6,'日语专业一班',3 union all
select 7,'日语专业二班',3 union all select 8, '法学院',0 union all
select 9, '刑法学专业',8 union all
select 10,'经济法学专业',8 union all
select 11,'刑法学专业一班',9 union all
select 12,'刑法学专业二班',9 union all
select 13,'经济法学专业一班',10 union all
select 14,'经济法学专业二班',10

2、效果图

#递归实现Demo

1、根据指定的节点向上获取所有父节点,向下获取所有子节点

 --根据指定的节点向下获取所有子节点
with
CTE
as
(
select * from GroupInfo where Id=1
union all
select G.* from CTE inner join GroupInfo as G
on CTE.Id=G.ParentGroupId
)
select * from CTE order by Id
 --根据指定的节点向上获取所有父节点
with
CTE
as
(
select * from GroupInfo where Id=14
union all
select G.* from CTE inner join GroupInfo as G
on CTE.ParentGroupId=G.Id
)
select * from CTE order by Id

2、构造递归路径

 --构造递归路径
with
CTE
as
(
select Id,GroupName,ParentGroupId,GroupPath=CAST( GroupName as nvarchar(max)) from GroupInfo where Id=1
union all
select G.*,CAST(CTE.GroupPath+'//'+G.GroupName as nvarchar(max)) as GroupPath from CTE
inner join GroupInfo as G
on CTE.Id=G.ParentGroupId
)
select * from CTE

3、分组递归,将同一条分支上节点放到一起

 --通过id字段的字符串的拼接,形成sort字段,再通过sort排序,来实现同一分支上的节点放到一起
WITH
CTE
AS
(
SELECT * ,CAST(RIGHT('' + CAST([Id] AS VARCHAR), 3) AS VARCHAR(MAX)) AS sort FROM GroupInfo
WHERE ParentGroupId = 0
UNION ALL
SELECT GroupInfo.* ,CAST(sort + RIGHT('' + CAST(GroupInfo.[Id] AS VARCHAR),3) AS VARCHAR(MAX)) AS sort
FROM CTE
INNER JOIN GroupInfo ON CTE.Id = GroupInfo.ParentGroupId
)
SELECT * FROM CTE ORDER BY sort

4、递归层级查询(查询出节点所属的层级)

 --查询节点层级
WITH CTE AS (
SELECT *,1 AS [Level] FROM GroupInfo WHERE ParentGroupId=0
UNION ALL
SELECT G.*,CTE.Level+1 FROM GroupInfo as G
JOIN CTE ON CTE.Id =G.ParentGroupId
)
SELECT * FROM CTE

最新文章

  1. [数据结构]——堆(Heap)、堆排序和TopK
  2. Fiddler 修改返回内容 OnBeforeResponse 无效 没用
  3. Completely disable mousewheel on a WinForm
  4. Objective-C面向对象(四)
  5. Android OkHttp详解
  6. jQuery源码笔记——延迟对象
  7. Spark No FileSystem for scheme file 解决方法
  8. 张金禹 C语言--第0次作业
  9. Windows phone 8.1之数据绑定(Data Binding)
  10. java格式化
  11. Hopfield神经网络
  12. php中 curl, fsockopen ,file_get_contents 三个函数
  13. (大数 string) Integer Inquiry hdu1047
  14. make V=1 查看完整的gcc编译信息
  15. HDU 3613 Best Reward(KMP算法求解一个串的前、后缀回文串标记数组)
  16. 矿难让显卡压了那么多货咋办?NV如是说
  17. Django内置模版过滤器
  18. JavaScript预编译详解
  19. Pyhton配置CGI
  20. Django基础学习三_路由系统

热门文章

  1. Cherrypy文件上传非ASCII文件名乱码问题解决
  2. java8 快速实现List转map 、分组、过滤等操作
  3. Win10解除网速限制让网速飞起来
  4. 为Arch Linux更换Archlinuxcn源(清华源)
  5. jvisualvm 连接 jstatd 远程监控 jvm 或 Visual GC提示"不受此JVM支持“
  6. 用 PLSQL 创建新用户及导入 dmp
  7. springboot项目
  8. js 点击复制代码 window.clipboardData.setData
  9. 秒杀系统HTML倒计时设置
  10. C# 使用DES对字符串进行加密