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 |