SQL: Komplette Tabellenhierarchie darstellen

Aus DBWiki
Wechseln zu: Navigation, Suche

Zurück zur Übersicht


SQL-Dialekte, die Common Table Expressions (CTE) unterstützen, können diese zum Bilden der Abfrage verwenden. Andere Systeme benötigen mehrere Self-Joins und mehrere Vereinigungsabfragen. Außerdem muss die maximale Verschachtelungstiefe bekannt sein.

Lösung für Jet-SQL

SELECT ma_name AS info
FROM   mitarbeiter
WHERE  mgr IS NULL
UNION
SELECT m0.ma_name & Space$( 8 - Len( m0.ma_name ) )
     & ' --> ' & m1.ma_name
FROM   mitarbeiter AS m0
       INNER JOIN mitarbeiter AS m1
               ON m0.ma_nr = m1.mgr
WHERE  m0.mgr IS NULL
UNION
SELECT m0.ma_name & Space$( 8 - Len( m0.ma_name ) )
     & ' --> ' & m1.ma_name & (Space$( 8 - Len( m1.ma_name ) ) + ' --> ' + m2.ma_name )
FROM   ( mitarbeiter AS m0
         INNER JOIN mitarbeiter AS m1
                 ON m0.ma_nr = m1.mgr )
       LEFT JOIN mitarbeiter AS m2
              ON m1.ma_nr = m2.mgr
WHERE  m0.mgr IS NULL
UNION
SELECT m0.ma_name & Space$( 8 - Len( m0.ma_name ) )
     & ' --> ' & m1.ma_name & Space$( 8 - Len( m1.ma_name ) )
     & ' --> ' & m2.ma_name & (Space$( 8 - Len( m2.ma_name ) ) + ' --> ' + m3.ma_name )
FROM   ( ( mitarbeiter AS m0
           INNER JOIN mitarbeiter AS m1
                   ON m0.ma_nr = m1.mgr )
         INNER JOIN mitarbeiter AS m2
                 ON m1.ma_nr = m2.mgr )
       LEFT JOIN mitarbeiter AS m3
              ON m2.ma_nr = m3.mgr
WHERE  m0.mgr IS NULL

Lösung mittels CTE

WITH RECURSIVE w ( info, ma_nr ) AS (
    SELECT rpad( ma_name, 8 ),
           ma_nr
    FROM   mitarbeiter
    WHERE  mgr IS NULL
    UNION  ALL
    SELECT info || ' --> ' || rpad( ma_name, 8 ),
           m.ma_nr
    FROM   mitarbeiter AS m,
           w
    WHERE  mgr = w.ma_nr
)
SELECT rtrim(info) AS info
FROM   w
ORDER  BY 1

Hier ist ein dazu passender DBFiddle.

info
König
König    --> Blank
König    --> Blank    --> Allard
König    --> Blank    --> Dreher
König    --> Blank    --> Jakobs
König    --> Blank    --> Mertens
König    --> Blank    --> Wecker
König    --> Johann
König    --> Johann   --> Fuhrmann
König    --> Johann   --> Fuhrmann --> Schmidt
König    --> Johann   --> Scheidt
König    --> Johann   --> Scheidt  --> Adam
König    --> Kühne
König    --> Kühne    --> Müller



Zurück zur Übersicht