3

ich ein Problem habe eine Abfrage als einen Baum wie dieserekursive SQL Query mit Auftragsbaum

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 

ich den folgenden Baum haben muß, um zu bestellen:

 
UT Root 
UT Root 
-- UT level 1 
UT Root 
-- UT level 1 
-- -- UT level 2 
UT Root 

Diese wie beabsichtigt arbeitet für Level 0 oder 1, aber für höhere Ebene ist es gebrochen. Ich versuche, die ‚Ebene 0‘ Eltern in Wurzel Spalte auszuwählen root und ut zu bestellen, aber nach einiger Zeit auf dieses Problem, ich kann :(nicht

Wie das?

Dank lösen für Ihre Hilfe

EDIT. Danke mit sQL-Farben für die Bearbeitung :) ich habe die Lösung für die oberste Ebene gesehen, aber Benutzer seinen Posten gelöscht haben.

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 

aber es funktioniert nicht zu

Hier ein Beispiel mit echten Daten

 
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 

Wie Sie sehen es nicht die gute Struktur ist. Ich brauche einen Baum wie folgt aus:

 
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  
+0

Sie haben uns das Problem nicht gesagt. – usr

Antwort

8

eit der rekursive Aufruf korrekt ist, liegt das Problem bei der Sortierung des Ergebnisses

ORDER BY root

Sie können versuchen, zu Erstellen Sie einen Sortierpfad, um sie in die richtige Reihenfolge zu bringen:

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 

Edit:

CASE => CAST (Schreibfehler)

Edit 2 (ein funktionierendes Beispiel von Testdaten hinzufügen):

Hier finden Sie eine Kopie und Paste Testcode haben. Funktioniert gut für mich:

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; 
+0

Ja, es funktioniert! (Außer 'CASE' statt 'CAST' :) Danke –

+0

* smile * Gern geschehen. Ich habe den Fehler auch bemerkt, aber er wurde bearbeitet. Viel Spaß beim Programmieren! – ANisus

+0

Wow, das ist genau das, was ich brauchte. Vielen Dank!! –