SQLServer CTE 递归查询

SQLServer CTE 递归查询

介绍

指定临时命名的结果集,这些结果集称为公用表表达式 (CTE)。 公用表表达式可以包括对自身的引用。 这种表达式称为递归公用表表达式。

例子

组合序号

--创建临时表
create table #ceshi(id int, pid int, xh varchar(20), mc varchar(20))
--插入数据
insert into #ceshi
  values(1, 0, '一', '1级节点_1'),(2, 0, '二', '1级节点_2'),
        (3, 1, '1', '2级节点_21'),(4, 1, '2', '2级节点_22'),(5, 2, '1', '2级节点_23'),
        (6, 3, '(1)', '3级节点_31'), (7, 3, '(2)', '3级节点_32'), (8, 4, '(1)', '3级节点_33'), (9, 4, '(2)', '3级节点_34')
--查询原数据
Select * from #ceshi;
--组成上级序号.当前序号的格式
WITH cte(id, pid, xh, mc) AS
  (Select id, pid, xh, mc from #ceshi WHERE pid = 0
   union all
   Select A.id, A.pid, CAST(B.xh + '.' + A.xh AS varchar(20)), A.mc from #ceshi A INNER JOIN cte B ON A.pid = B.id
)
SELECT * FROM cte order by xh
--删除临时表
drop table #ceshi

原数据

id pid xh mc
1 0 1级节点_1
2 0 1级节点_2
3 1 1 2级节点_21
4 1 2 2级节点_22
5 2 1 2级节点_23
6 3 (1) 3级节点_31
7 3 (2) 3级节点_32
8 4 (1) 3级节点_33
9 4 (2) 3级节点_34

组成数据

id pid xh mc
2 0 1级节点_2
5 2 二.1 2级节点_23
1 0 1级节点_1
3 1 一.1 2级节点_21
6 3 一.1.(1) 3级节点_31
7 3 一.1.(2) 3级节点_32
4 1 一.2 2级节点_22
8 4 一.2.(1) 3级节点_33
9 4 一.2.(2) 3级节点_34

参考文档

官方文档

SQL Server CTE 递归查询全解

解决CTE定位点类型和递归部分的类型不匹配

posted @ 2022-12-03 10:01  txgh  阅读(297)  评论(0编辑  收藏  举报