获取完整层次结构路径的SQL查询

时间:2010-09-16 14:16:12

标签: sql-server tsql

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

3 个答案:

答案 0 :(得分:6)

这是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

答案 1 :(得分:4)

我解决了这个问题,非常类似于Joe的解决方案。

    with cte (NodeId,NodeName,hierarchyPath)as
(
    select NodeId,NodeName, NodeName
    from Node
    where ParentNodeId is null 
    union all
    select n.NodeId, n.NodeName, CONVERT(varchar(256), cte.hierarchyPath + '/' + n.NodeName)
    from Node n
    join cte on n.ParentNodeId = cte.NodeId
)

select * 
from cte 
order by NodeId

答案 2 :(得分:0)

根据我的经验,最有效的方法是添加一个额外的字段RootNodeID,其中包含树状结构的顶层节点的id。 因此,您可以以非常简单有效的方式查询整个树结构中的所有节点。

要构建树结构,应用程序中的简单递归函数应该可以正常工作。

我知道它是非规范化的,有些人并不真正赞同这个概念,但我从专业经验中学到,这会带来巨大的性能提升,而不是精心设计的t-sql脚本。