我有一个 parent 表看起来像这样

CHILD_ID | PARENT_ID | NAME
1        | Null      | Bill
2        | 1         | Jane
3        | 1         | Steve
4        | 2         | Ben
5        | 3         | Andrew

我想得到这样的结果集
Bill
---Jane
------Ben
---Steve
------Andrew

我知道我需要做一个排名查询来对级别和自连接进行排名,但我在网上能找到的只是 CTE 递归

我以前在 Oracle 中做过这个,但没有在 MS SQL 中做过

最佳答案

有点hacky,可以改进,但希望它显示了原理......

;with relation (childId, parentId, childName, [level], [orderSequence])
as
(
select childId, parentId, childName, 0, cast(childId as varchar(20))
from @parents
where parentId is null
union all
select p.childId, p.parentId, r.[level]+1, cast(r.orderSequence + '_' + cast(p.childId as varchar) as varchar(20))
from @parents p
inner join relation r on p.parentId = r.childId
)

select right('----------', ([level]*3)) +childName
from relation
order by orderSequence

但是,如果您想避免递归,那么另一种方法是使用相关的树结构信息实现一个树表 - 请参阅 http://www.sqlteam.com/article/more-trees-hierarchies-in-sql 了解详情

关于sql-server - 父/子层次结构树 View ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9380620/

10-12 19:26