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定位点类型和递归部分的类型不匹配