我有一个 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/