Requête SQL récursive avec tree de commands

J'ai un problème pour order une requête en tant qu'tree

WITH UtHierarchy AS ( SELECT etabid ,ut ,utlib ,parenteut ,0 AS LEVEL ,ut AS root FROM RUT WHERE etabid = 1 AND parenteut IS NULL UNION ALL SELECT RUT.etabid ,RUT.ut ,RUT.utlib ,RUT.parenteut ,LEVEL + 1 AS LEVEL ,RUT.parenteut AS root FROM RUT INNER JOIN UtHierarchy uh ON uh.ut = rut.parenteut WHERE RUT.ETABID = 1 ) SELECT * FROM UtHierarchy ORDER BY root 

J'ai besoin de l'tree suivant:

 Racine UT
 Racine UT
 - Niveau 1 UT
 Racine UT
 - Niveau 1 UT
 - - UT niveau 2
 Racine UT

Cela fonctionne comme prévu pour le niveau 0 ou 1, mais pour le niveau supérieur, il est cassé. J'essaie de sélectionner dans la colonne racine le parent 'level 0' à order par root et ut, mais après un certain time sur ce problème, je ne peux pas 🙁

Comment résoudre ceci?

Merci de votre aide.

EDIT : Merci pour l'édition avec les colors SQL 🙂 J'ai vu la solution pour le niveau le plus élevé, mais l'user a supprimé son message.

 WITH UtHierarchy AS ( SELECT etabid ,ut ,utlib ,parenteut, 0 as profondeur, ut as root FROM RUT where etabid = 278 and parenteut is null UNION ALL SELECT RUT.etabid , RUT.ut , RUT.utlib , RUT.parenteut , profondeur + 1 as profondeur , root as root FROM RUT inner join UtHierarchy uh on uh.ut = rut.parenteut where RUT.ETABID = 278 ) select ut, parenteut, profondeur, root from UtHierarchy order by root 

mais ça ne marche pas trop

Voici un exemple avec de vraies données

 ut parenteutlevel root
 10 1 1 1
 11 1 1 1
 12 1 1 1
 13 1 1 1
 14 1 1 1
 130 13 2 1
 131 13 2 1
 132 13 2 1
 133 13 2 1
 134 13 2 1
 135 13 2 1
 136 13 2 1
 120 12 2 1
 121 12 2 1
 122 12 2 1
 110 11 2 1
 111 11 2 1
 112 11 2 1
 113 11 2 1
 114 11 2 1
 115 11 2 1
 116 11 2 1
 101 10 2 1
 102 10 2 1
 103 10 2 1
 104 10 2 1
 105 10 2 1
 106 10 2 1
 107 10 2 1
 1 0 1

Comme vous pouvez le voir, ce n'est pas la bonne structure. J'ai besoin d'un tree comme ceci:

 ut parenteutlevel root
 1 0 1
 10 1 1 1
 101 10 2 1
 102 10 2 1
 103 10 2 1
 104 10 2 1
 105 10 2 1
 106 10 2 1
 107 10 2 1
 11 1 1 1
 110 11 2 1
 111 11 2 1
 112 11 2 1
 113 11 2 1
 114 11 2 1
 115 11 2 1
 116 11 2 1
 12 1 1 1
 120 12 2 1
 121 12 2 1
 122 12 2 1
 13 1 1 1
 130 13 2 1
 131 13 2 1
 132 13 2 1
 133 13 2 1
 134 13 2 1
 135 13 2 1
 136 13 2 1
 14 1 1 1    

epuis que l'appel récursif est correct, votre problème réside dans le sorting du résultat

COMMANDER PAR root

Vous pouvez essayer de créer un path de sorting pour les placer dans le bon ordre:

 WITH UtHierarchy AS ( SELECT etabid ,ut ,utlib ,parenteut ,0 AS LEVEL ,ut AS root ,RIGHT('000000' + CAST(ut AS varchar(MAX)), 6) AS sort FROM RUT WHERE etabid = 1 AND parenteut IS NULL UNION ALL SELECT RUT.etabid ,RUT.ut ,RUT.utlib ,RUT.parenteut ,LEVEL + 1 AS LEVEL ,RUT.parenteut AS root ,uh.sort+'/'+RIGHT('000000' + CAST(RUT.ut AS varchar(20)), 6) AS sort FROM RUT INNER JOIN UtHierarchy uh ON uh.ut = rut.parenteut WHERE RUT.ETABID = 1 ) SELECT * FROM UtHierarchy ORDER BY sort 

Modifier:

CAS => CAST (faute d'orthographe)

Edit 2 (Ajout d'un exemple de travail à partir de vos données de test):

Ici vous avez un copyr-coller du code de test. Fonctionne bien pour moi:

 SELECT 10 AS ut, 1 AS parenteut INTO #RUT UNION ALL SELECT 11, 1 UNION ALL SELECT 12, 1 UNION ALL SELECT 13, 1 UNION ALL SELECT 14, 1 UNION ALL SELECT 130, 13 UNION ALL SELECT 131, 13 UNION ALL SELECT 132, 13 UNION ALL SELECT 133, 13 UNION ALL SELECT 134, 13 UNION ALL SELECT 135, 13 UNION ALL SELECT 136, 13 UNION ALL SELECT 120, 12 UNION ALL SELECT 121, 12 UNION ALL SELECT 122, 12 UNION ALL SELECT 110, 11 UNION ALL SELECT 111, 11 UNION ALL SELECT 112, 11 UNION ALL SELECT 113, 11 UNION ALL SELECT 114, 11 UNION ALL SELECT 115, 11 UNION ALL SELECT 116, 11 UNION ALL SELECT 101, 10 UNION ALL SELECT 102, 10 UNION ALL SELECT 103, 10 UNION ALL SELECT 104, 10 UNION ALL SELECT 105, 10 UNION ALL SELECT 106, 10 UNION ALL SELECT 107, 10 UNION ALL SELECT 1, 0; WITH UtHierarchy AS ( SELECT ut ,parenteut ,0 AS LEVEL ,ut AS root ,RIGHT('000000' + CAST(ut AS varchar(MAX)), 6) AS sort FROM #RUT WHERE parenteut = 0 UNION ALL SELECT RUT.ut ,RUT.parenteut ,LEVEL + 1 AS LEVEL ,RUT.parenteut AS root ,uh.sort+'/'+RIGHT('000000' + CAST(RUT.ut AS varchar(20)), 6) AS sort FROM #RUT AS RUT INNER JOIN UtHierarchy uh ON uh.ut = rut.parenteut ) SELECT * FROM UtHierarchy ORDER BY sort DROP TABLE #RUT;