1

我希望返回一个完全像这样显示的查询:

根 1
--> 子 2
-----> 子 3
根 2
--> 子 4
----> 子 5

所以查询应该返回 Root 1 作为一行,---> Child 2 作为另一行。假设n个级别,并且为每个孩子放置“--->”格式。级别更高然后“---->”增加。

我的表定义是

[NodeId、ParentId、名称、级别]

4

1 回答 1

4

在 SQL Server 2008 及更高版本上,您可以使用 hierarchyId 数据类型快速实现所需的排序。您可以使用 REPLICATE() 来获取破折号。

;with cte as (
    select NodeId, ParentId, Name, 0 Level, '/' + cast(NodeId as varchar(max)) + '/' Hier
    from tbl1
    where ParentId is null
    union all
    select t.NodeId, t.ParentId, t.Name, Level+1, Hier + cast(t.NodeId as varchar(max)) + '/'
    from tbl1 t
    join cte c on t.ParentId = c.NodeId
)
select case when level=0
            then ''
            else replicate('-',level*2) + '>' end + Name
from cte
order by cast(Hier as hierarchyid);

SQL小提琴

在早期的 SQL Server 2005 上,您可以使用零填充字符串模拟 hierarchyId 排序:

;with cte as (
    select NodeId, ParentId, Name, 0 Level, right(replicate('0',10)+cast(NodeId as varchar(max)),11) Hier
    from tbl1
    where ParentId is null
    union all
    select t.NodeId, t.ParentId, t.Name, Level+1, Hier + right(replicate('0',10)+cast(t.NodeId as varchar(max)),11)
    from tbl1 t
    join cte c on t.ParentId = c.NodeId
)
select case when level=0
            then ''
            else replicate('-',level*2) + '>' end + Name
from cte
order by Hier;
于 2012-10-30T13:51:02.253 回答