SQL SERVER 关于树形排序的处理

今天在CSDN看到个题目是关于树形在内容:
题目如下(但实际的题目更简单)

create table #t(id int,parentid varchar(10))
insert into #t
select 1, 0 union all
select 10, 1 union all
select 13, 10 union all
select 16, 10 union all
select 11, 16 union all
select 3, 0 union all
select 4, 3 union all
select 8, 4 union all
select 5, 3 union all
select 6, 5 union all
select 7, 3 union all
--输出结果
/*
id          parentid
----------- ----------
1           0
10          1
13          10
16          10
11          16
3           0
4           3
8           4
5           3
6           5
7           3*/

看到题目后,我记得以前曾看到过类似的问题,并查看收集的资料,处理如下:

--处理内容
SELECT *
FROM #t a
    LEFT JOIN #t b ON a.parentid=b.id
ORDER BY CASE
        WHEN b.parentid IS NULL THEN a.id
        WHEN b.parentid=0 THEN b.id
        ELSE b.parentid END,
    CASE
        WHEN b.parentid=0 THEN a.id
        ELSE a.parentid END,
    a.id

--以上就是答案,但以上的查询是有条件的,就是递归的内容不超过三个(父子关系不超过三代)

--若递归多的话,怎么办呢?
--想了个办法就是利用以下语句完成。

with cte(id1,id,parentid)
as
(select cast(row_number() over(order by id) as varchar(10)) id1,*from #t where parentid=0
union all
select  cast(id1+cast(row_number() over(order by a.id)as varchar(10)) as varchar(10)),a.* from #t a join cte  on cte.id=a.parentid )

select  id,parentid from cte  order by id1

 

--特此标记12:09:05

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>