2010-04-26 6 views
6

J'ai une table qui met en œuvre un arbre à l'aide hierarchyid colonnetri arbre avec autre colonne dans SQL Server 2008

données Exemple:

People    \ 
    Girls   \1\ 
     Zoey  \1\1\ 
     Kate  \1\2\ 
     Monica  \1\3\ 
    Boys   \2\ 
     Mark  \2\1\ 
     David  \2\2\ 

Voici l'ordre à l'aide hierarchyid colonne comme une sorte colonne

Je voudrais trier les données en utilisant hierarchyid mais aussi en utilisant nom il donc ressembler à ceci:

People    \ 
    Boys   \2\ 
     David  \2\2\ 
     Mark  \2\1\   
    Girls   \1\ 
     Kate  \1\2\ 
     Monica  \1\3\ 
     Zoey  \1\1\  

Y at-il une solution simple à faire? Peut-il être fait avec une seule requête SQL

Répondre

7

Ressaisissez votre requête comme CTE récursive:

DECLARE @table TABLE (id INT NOT NULL PRIMARY KEY, name NVARCHAR(4000) NOT NULL, path HIERARCHYID) 

INSERT 
INTO @table 
VALUES 
     (1, 'People', '/'), 
     (2, 'Girls', '/1/'), 
     (3, 'Boys', '/2/'), 
     (4, 'Zoey', '/1/1/'), 
     (5, 'Kate', '/1/2/'), 
     (6, 'Monica', '/1/3/'), 
     (7, 'Mark', '/2/1/'), 
     (8, 'David', '/2/2/') 

;WITH q AS 
     (
     SELECT *, HIERARCHYID::Parse('/') AS newpath 
     FROM @table 
     WHERE path = HIERARCHYID::GetRoot() 
     UNION ALL 
     SELECT t.*, HIERARCHYID::Parse(q.newpath.ToString() + CAST(ROW_NUMBER() OVER (ORDER BY t.name) AS NVARCHAR(MAX)) + '/') 
     FROM q 
     JOIN @table t 
     ON  t.path.IsDescendantOf(q.path) = 1 
       AND t.path.GetLevel() = q.path.GetLevel() + 1 
     ) 
SELECT * 
FROM q 
ORDER BY 
     newpath 
+0

Merci beaucoup! Fonctionne très bien – bodziec