基于树结构的返回查询

时间:2012-10-30 13:32:35

标签: sql sql-server

我希望返回一个显示如下的查询:

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

因此查询应该将Root 1作为一行返回,--->孩子2作为另一行。假设n级,和“--->”格式适用于每个孩子。等级高于“---->”增加。

我的表定义是

[NodeId,ParentId,姓名,级别]

1 个答案:

答案 0 :(得分: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 Fiddle

在早期的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;