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
5
A
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
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.
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
- 1. Verwenden Sie JDT, um den vollständigen Methodennamen zu erhalten
- 2. decodiere tinyurl in R, um den vollständigen URL-Pfad zu erhalten?
- 3. PHP Zufalls tmp-Datei erstellen und erhalten den vollständigen Pfad
- 4. Erhalten Sie den vollständigen Benutzernamen einen neuen Benutzernamen
- 5. LINQ, um den kleinsten Wert zu erhalten?
- 6. Bitshift, um den Rest zu erhalten
- 7. Erhalten Sie den vollständigen DOM-Stapel als Zeichenfolge
- 8. So erhalten Sie den vollständigen Linktext mit Scrapy
- 9. Erhalten Sie den vollständigen Audio-Gerätenamen von Windows
- 10. VBScript: Wie erhalten Sie den vollständigen Pfad des laufenden Prozesses?
- 11. Wie erhalten Sie den vollständigen Nachrichtentext in Gmail?
- 12. So erhalten Sie den vollständigen Befehlspfad für LSF gestartet
- 13. Python kann den vollständigen Pfadnamen der Datei nicht erhalten
- 14. So erhalten Sie den vollständigen Pfad von StreamWriter
- 15. Wie erhalten Sie den vollständigen Hostnamen in C#?
- 16. jquery auf Tropfen erhalten vollständigen Pfadnamen
- 17. Verwenden Sie sed, um den Dateinamen vom vollständigen Pfad abzurufen?
- 18. Erhalten Dateinamen nur aus vollständigen Pfad
- 19. Keine vollständigen Antwortheader mit AFNetworking erhalten
- 20. Erhalten vollständigen CPU-Namen ohne WMI
- 21. Gibt es eine Möglichkeit, den vollständigen Pfad des Abschriftenposts in Jekyll zu erhalten?
- 22. Um Tabellendetails zu erhalten
- 23. Keine vollständigen Daten mit Hibernate erhalten
- 24. CakePHP 3.x, So erhalten Sie den vollständigen Pfad zu einer Vorlagendatei
- 25. JavaScript, um Texteingabewert zu erhalten
- 26. Algorithmus, um MST in einem riesigen vollständigen Graph zu finden
- 27. Wie man Hudson erhält, um vollständigen Selenbericht zu zeigen?
- 28. Verwenden von Reflektion, um den Namen eines Parameters zu erhalten
- 29. eine Aufzählung werfen, um den damit verbundenen Wert zu erhalten?
- 30. Regex, um den gesamten Text außerhalb der Klammern zu erhalten
Jede Chance, dass Sie mir helfen können, diese Antwort für meinen Fall anzupassen? http://StackOverflow.com/Q/5549480/93202 –