我有一个包含三列NodeId,ParentNodeId,NodeName的表。对于每个节点,我想获得一个完整的路径,例如“lvl1/lvl2/lvl3 ...”,其中lvl1,lvl2和lvl3是节点名称。我在此链接http://www.sql-server-helper.com/functions/get-tree-path.aspx中找到了一个执行此操作的函数。但我想使用CTE或其他任何技术来提高效率。请让我知道是否有可能以更好的方式实现这一目标。提前致谢。

最佳答案

这是CTE版本。

declare @MyTable table (
    NodeId int,
    ParentNodeId int,
    NodeName char(4)
)

insert into @MyTable
    (NodeId, ParentNodeId, NodeName)
    select 1, null, 'Lvl1' union all
    select 2, 1, 'Lvl2' union all
    select 3, 2, 'Lvl3'

declare @MyPath varchar(100)

;with cteLevels as (
    select t.NodeId, t.ParentNodeId, t.NodeName, 1 as level
        from @MyTable t
        where t.ParentNodeId is null
    union all
    select t.NodeId, t.ParentNodeId, t.NodeName, c.level+1 as level
        from @MyTable t
            inner join cteLevels c
                on t.ParentNodeId = c.NodeId
)
select @MyPath = case when @MyPath is null then NodeName else @MyPath + '/' + NodeName end
    from cteLevels
    order by level

select @MyPath

10-05 19:54