2010-04-26 18 views
6

Tengo una tabla que implementa un árbol usando hierarchyid columna de datosárbol de clasificación con otra columna en SQL Server 2008

muestra:

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

Este es el orden usando hierarchyid la columna como una especie columna

Me gustaría ordenar los datos usando hierarchyid pero también usando nombre por lo que se vería así:

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

¿Hay una solución simple de hacer esto?

¿Se puede hacer con una sola consulta SQL?

Respuesta

7

reescribir su consulta como un recursivo CTE:

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

Muchas gracias! Funciona genial – bodziec

Cuestiones relacionadas