SQL: Alle untergeordneten Datensätze für einen bestimmten Datensatz suchen

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. In anderen SQL-Dialekten muss die maximale Ebene der Verschachtelung bekannt sein. Man kann dann mittels Vereinigungsabfragen jede Ebene zusammenführen.


Es soll z.B. eine Liste aller Mitarbeiter ausgegeben werden, die direkt oder indirekt für Johann arbeiten.

Lösung für Jet-SQL

Hinweis für Access-Anwender
Um die folgenden Abfragen selbst testen zu können, müssen die Tabellen der Übungsdatenbank vorhanden sein.

Um die Abfrage einigermaßen übersuchtlich zu halten, werden drei gespeicherte Abfragen u1, u2 und u3 verwendet.


Abfrage u1

SELECT 1 AS ebene,
       ma_name,
       mgr,
       ma_nr
FROM   mitarbeiter
WHERE  ma_name = 'Johann'

Abfrage u2

SELECT 2 AS ebene,
       ma_name,
       mgr,
       ma_nr
FROM   mitarbeiter
WHERE  mgr = ( SELECT ma_nr
               FROM u1 )

Abfrage u3

SELECT 3 AS ebene,
       ma_name,
       mgr,
       ma_nr
FROM   mitarbeiter
WHERE  mgr IN ( SELECT ma_nr
                FROM u2)


Hauptabfrage

SELECT ebene,
       ma_name
FROM   u1
UNION
SELECT ebene,
       ma_name
FROM   u2
UNION
SELECT ebene,
       ma_name
FROM   u3

Lösung mittels CTE

WITH RECURSIVE w ( ebene, ma_name, ma_nr ) AS (
    SELECT 1,
           ma_name,
           ma_nr
    FROM   mitarbeiter
    WHERE  ma_name = 'Johann'
    UNION  ALL
    SELECT ebene + 1,
           m.ma_name,
           m.ma_nr
    FROM   mitarbeiter AS m,
           w
    WHERE  m.mgr = w.ma_nr
)
SELECT ebene,
       ma_name
FROM   w
ORDER  BY 1, 2

Die Lösung kann in diesem DBFiddle eingesehen werden.

ebene ma_name
1 Johann
2 Fuhrmann
2 Scheidt
3 Adam
3 Schmidt



Zurück zur Übersicht