2010-09-16 22 views
5

Üç sütun NodeId, ParentNodeId, NodeName içeren bir tablom var. Her düğüm için lvl1, lvl2 ve lvl3 düğüm adlarının olduğu "lvl1/lvl2/lvl3 ..." gibi tam bir yol almak istiyorum. Bu bağlantıyı http://www.sql-server-helper.com/functions/get-tree-path.aspx'da yapan bir işlev buldum. ama CTE VEYA herhangi bir başka teknik için verimlilik kullanmak istiyorum. Bunu daha iyi bir şekilde başarmak mümkün ise lütfen bana bildirin. Şimdiden teşekkürler.Tam hiyerarşi yolunu almak için SQL sorgusu

cevap

6

İşte bir CTE sürümü.

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

Bu cevabı benim durumum için uyarlamama yardımcı olabilecek bir ihtimal var mı? http://stackoverflow.com/q/5549480/93202 –

0

en etkili yolu, benim deneyim, treestructure ait toplevel düğümün kimliğini içeren ek bir alan, RootNodeID eklemek olacaktır. Böylece tüm düğümleri tüm treest yapısında çok basit ve verimli bir şekilde sorgulayabilirsiniz.

Ve bu treest yapısını oluşturmak için uygulamanızda basit bir özyinelemeli işlev gayet iyi çalışmalıdır.

Denormalizasyon olduğunu biliyorum ve bazı insanlar bu kavramı gerçekten onaylamıyor, ancak mesleki deneyimlerimde bunun ayrıntılı bir t-sql betiğinin aksine büyük bir performans artışı getirdiğini öğrendim.

+0

Bunun için basit bir kod örneği sağlayabilirsiniz lütfen? – RKP

+0

İçinde hangi dili istersin? –

+0

SQL Server Transact SQL – RKP

4

Bunu, Joe'nun çözümüne çok benzer şekilde çözdüm.

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