Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL-Abfrage für Baumtabelle

Aufbauend auf der Antwort von a_horse_with_no_name zeigt dies, wie die SQL Server-Implementierung des rekursiven CTE verwendet wird (recursive single-record cross apply ) in Kombination mit row_number(), um die exakte Ausgabe in der Frage zu erzeugen.

declare @t table(id int,parentId int,name varchar(20))
insert @t select 1,  0        ,'Category1'
insert @t select 2,  0,        'Category2'
insert @t select 3,  1,        'Category3'
insert @t select 4 , 2,        'Category4'
insert @t select 5 , 1,        'Category5'
insert @t select 6 , 2,        'Category6'
insert @t select 7 , 3,        'Category7'
;

WITH tree (id, parentid, level, name, rn) as 
(
   SELECT id, parentid, 0 as level, name,
       convert(varchar(max),right(row_number() over (order by id),10)) rn
   FROM @t
   WHERE parentid = 0

   UNION ALL

   SELECT c2.id, c2.parentid, tree.level + 1, c2.name,
       rn + '/' + convert(varchar(max),right(row_number() over (order by tree.id),10))
   FROM @t c2 
     INNER JOIN tree ON tree.id = c2.parentid
)
SELECT *
FROM tree
ORDER BY cast('/' + RN + '/' as hierarchyid)

Um ehrlich zu sein, würde es funktionieren, die IDs selbst zu verwenden, um den "Pfad" des Baums zu erzeugen, da wir direkt nach ID bestellen, aber ich dachte, ich würde die Funktion row_number() einfügen.