sql >> Database >  >> RDS >> Sqlserver

Sql-query voor boomtabel

Voortbouwend op het antwoord van a_horse_with_no_name, laat dit zien hoe u de implementatie van recursieve CTE door SQL Server kunt gebruiken (recursive single-record cross apply ) in combinatie met row_number() om de exacte uitvoer in de vraag te produceren.

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)

Om eerlijk te zijn, het zou werken om de ID's zelf te gebruiken om het "pad" van de boom te produceren, aangezien we rechtstreeks op id bestellen, maar ik dacht dat ik de functie row_number() zou gebruiken.



  1. Dagen aan een datum toevoegen in T-SQL

  2. Het belang van het selecteren van de juiste Azure VM-grootte

  3. Hoe MapReduce werkt in Hadoop

  4. 8 WP-CLI-opdrachten om uw site op te schonen en te optimaliseren