Contrôler l'ordre de frères et soeurs sous CTE récursif?

J'ai une requête CTE qui search les feuilles principales et secondaires. mais j'ai du mal à contrôler l'ordre de sélection des feuilles entre 2 frères et soeurs :

Chaque ligne de la table est déclarée comme:

(childID INT ,parentID INT ,NAME NVARCHAR(30),location int)

Où l' location est une priorité pour sortinger IFF ils sont frères et soeurs.

Et j'ai donc cette structure arborescente: ces paires ont une priorité de localization:

entrez la description de l'image ici

Par exemple :

 `a` ( location=1) should be before `f` (location=2) `b` ( location=1) should be before `e` (location=2) `d` ( location=1) should be **before** `c` (location=2) 

Le problème est qu'il semble que je dois d' abord order by childID afin de voir la bonne structure ( frères et sœurs non sortingés ).

Mais – comment est-ce que ma order by devrait ressembler ainsi je serai capable de voir la bonne structure ( && sibling sortingée )?

(dans mon exemple: d devrait venir avant c )

Voici la requête de travail qui donne toutes les feuilles de l'tree (frères et soeurs non sortingés)

ps childID n'indique rien sur le sorting. c'est juste un espace réservé. Comme je l'ai dit, l'location entre 2 frères est par la colonne de location (ici, childId est sortingé parce que c'est l'ordre dans lequel j'ai inséré les lignes …

Vous pouvez calculer le path du noeud de l'tree dans votre CTE et l'utiliser pour le sorting

 ;WITH CTE AS( SELECT childID, parentID, 0 AS depth, NAME , location, cast(location as varbinary(max)) path FROM @myTable WHERE childID = parentID UNION ALL SELECT TBL.childID, TBL.parentID, CTE.depth + 1 , TBL.name ,TBL.location, cte.path + cast(TBL.location as binary(4)) FROM @myTable AS TBL INNER JOIN CTE ON TBL.parentID = CTE.childID WHERE TBL.childID<>TBL.parentID ) SELECT depth, childID, parentID, location, REPLICATE('----', depth) + name FROM CTE ORDER BY path 

Ce qui suit est la réponse de i-one modifiée, à la request de Royi Namir, d'utiliser des strings numériques à gauche pour le path:

 ;WITH CTE AS( SELECT childID, parentID, 0 AS depth, NAME , location, Cast( Right( '00000' + Cast( Location as VarChar(6) ), 6 ) as VarChar(1024) ) as Path FROM @myTable WHERE childID = parentID UNION ALL SELECT TBL.childID, TBL.parentID, CTE.depth + 1 , TBL.name ,TBL.location, Cast( cte.Path + '.' + Right( '00000' + Cast( Tbl.Location as VarChar(6) ), 6 ) as VarChar(1024) ) FROM @myTable AS TBL INNER JOIN CTE ON TBL.parentID = CTE.childID WHERE TBL.childID<>TBL.parentID ) SELECT depth, childID, parentID, location, REPLICATE('----', depth) + name FROM CTE ORDER BY path 

NB: non testé et écrit en vacances.

Les séparateurs ( . ) Ne sont pas nécessaires, mais facilitent la lecture des valeurs résultantes et peuvent simplifier certaines opérations, par exemple find des sous-paths communs.