TRI des requêtes hiérarchiques dans SQL Server 2005

J'ai un problème suivant: J'ai un tableau pour maintenir datatables hiérarchiques. Je voudrais utiliser CTE de SQL 2005.

WITH tree (id, parentid, code, name) AS ( SELECT id, ofs.ParentID, ofs.code, ofs.name FROM OrganizationFeatures ofs WHERE ofs.ParentID IS NULL UNION ALL SELECT ofs.id, ofs.ParentID, ofs.code, ofs.name FROM OrganizationFeatures ofs JOIN tree ON tree.ID = ofs.ParentID ) select * from tree 

Mais je voudrais sortinger par code et le résultat devrait être comme suit:

 1 1/1 1/1/1 1/1/2 1/2/1 1/2/2 2 4/1 

etc. Des idées?

Pour get les valeurs concaténées, vous devez le faire dans le avec.

Pour sortinger, vous devez append une command dans la dernière sélection.

 WITH tree (id, parentid, code, name) AS ( SELECT id, ofs.ParentID, ofs.code, ofs.name FROM OrganizationFeatures ofs WHERE ofs.ParentID IS NULL UNION ALL SELECT ofs.id, ofs.ParentID, tree.code+'/'+ofs.code, ofs.name FROM OrganizationFeatures ofs JOIN tree ON tree.ID = ofs.ParentID ) select * from tree order by code 

Aussi, si le code n'est pas un varchar, vous devrez convertir les colonnes de code dans ce bit de code ( tree.code+'/'+ofs.code ) pour que cela fonctionne.

Loki, j'ai eu la même requête mais elle n'a pas sortingé par nom comme je voulais mais par le code – c'était vendredi et j'étais surchargé.

Quoi qu'il en soit, l'exécution de votre requête m'a donné une erreur, il est nécessaire de lancer; J'ai dû le changer comme suit:

 WITH tree (id, parentid, name, code) AS ( SELECT id, ofs.ParentID, ofs.name, CAST(ofs.name as varchar(255)) FROM OrganizationFeatures ofs WHERE ofs.ParentID IS NULL UNION ALL SELECT ofs.id, ofs.ParentID, ofs.name, CAST(tree.code+'/'+ofs.name as varchar(255)) FROM OrganizationFeatures ofs JOIN tree ON tree.ID = ofs.ParentID ) select * from tree order by code 

Le problème est qu'il est nécessaire de lancer un varchar en dépit du fait que le nom est varchar. Il est tout à fait possible que varchar (255) ne soit pas suffisant avec de grands trees.

J'ai donc fait une version où le problème mentionné ci-dessus n'est pas si grand:

 WITH tree (id, parentid, name, code) AS ( SELECT id, ofs.ParentID, ofs.name, CAST(ROW_NUMBER() OVER (ORDER BY ofs.name ASC) as varchar(255)) FROM OrganizationFeatures ofs WHERE ofs.ParentID IS NULL UNION ALL SELECT ofs.id, ofs.ParentID, ofs.name, CAST(tree.code +'/' + CAST(ROW_NUMBER() OVER (ORDER BY ofs.name ASC) as varchar(255)) as varchar(255)) FROM OrganizationFeatures ofs JOIN tree ON tree.ID = ofs.ParentID ) select * from tree order by code 

Mais je n'aime pas une telle solution où il est nécessaire de lancer. Y a-t-il une meilleure solution?