2010-09-16 143 views
5

我有一个包含三列NodeId,ParentNodeId,NodeName的表。对于每个节点,我希望得到像“lvl1/lvl2/lvl3 ...”这样的完整路径,其中lvl1,lvl2和lvl3是节点名称。我发现一个功能,在这个链接http://www.sql-server-helper.com/functions/get-tree-path.aspx。但我想用CTE或任何其他技术来提高效率。请让我知道是否有可能以更好的方式实现这一目标。提前致谢。SQL查询以获得完整的层次结构路径

回答

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 
+0

任何机会,你可以帮我适应我的情况这个答案? http://stackoverflow.com/q/5549480/93202 – 2011-04-05 09:00:18

0

最有效的方法,以我的经验,将增加一个额外的领域,RootNodeID,包含treestructure的顶级节点的ID。 因此,您可以非常简单高效地查询整个树结构中的所有节点。

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

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

+0

你能提供一个简单的代码示例吗? – RKP 2010-09-16 14:51:59

+0

你喜欢哪种语言? – 2010-09-16 15:00:13

+0

SQL Server事务处理SQL – RKP 2010-09-16 15:01:42

4

我是这样解决的,与乔的解决方案非常相似。

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