2010-09-16 4 views
5

Ich habe eine Tabelle mit drei Spalten NodeId, ParentNodeId, NodeName. Für jeden Knoten möchte ich einen vollständigen Pfad wie "lvl1/lvl2/lvl3 ..." erhalten, wobei lvl1, lvl2 und lvl3 Knotennamen sind. Ich habe eine Funktion gefunden, die das unter diesem Link http://www.sql-server-helper.com/functions/get-tree-path.aspx macht. aber ich würde gerne CTE ODER irgendeine andere Technik für die Effizienz verwenden. Bitte lassen Sie mich wissen, wenn es möglich ist, dies auf eine bessere Weise zu erreichen. Danke im Voraus.SQL-Abfrage, um den vollständigen Hierarchiepfad zu erhalten

Antwort

6

Hier ist eine CTE-Version.

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

Jede Chance, dass Sie mir helfen können, diese Antwort für meinen Fall anzupassen? http://StackOverflow.com/Q/5549480/93202 –

0

Der effizienteste Weg, meiner Erfahrung nach, wäre ein zusätzliches Feld hinzufügen, RootNodeID, die ID des Toplevel-Knoten der Baumstruktur enthält. So können Sie alle Knoten in einer gesamten Baumstruktur auf sehr einfache und effiziente Weise abfragen.

Und um diese Baumstruktur zu erstellen, sollte eine einfache rekursive Funktion in Ihrer Anwendung gut funktionieren.

Ich weiß, es ist Denormalisierung, und einige Leute nicht wirklich das Konzept, aber ich habe in meiner beruflichen Erfahrung gelernt, dass dies eine enorme Leistungssteigerung, im Gegensatz zu einem aufwendigen T-SQL-Skript bringt.

+0

können Sie bitte ein einfaches Codebeispiel dafür bereitstellen? – RKP

+0

In welcher Sprache möchten Sie das? –

+0

SQL Server Transact SQL – RKP

4

Ich löste es so ähnlich wie Joes Lösung.

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 
Verwandte Themen