SQL: Ermitteln, welche Datensätze Blatt-, Zweig- oder Wurzelknoten sind

Aus DBWiki
Wechseln zu: Navigation, Suche

Zurück zur Übersicht



In drei Unterabfragen, die einen skalaren Wert liefern, lässt sich ermitteln, ob ein Datensatz einen Wurzel-, Zweig- oder Blattknoten darstellt.


Es soll z.B. diese Ermittlung für alle Mitarbeiter vorgenommen werden.

Lösung für Jet-SQL

SELECT *
FROM   ( SELECT ma_name,
                ( SELECT IIf( count( * ) > 0, 'X' )
                  FROM   mitarbeiter
                  WHERE  ma_nr = m.ma_nr AND
                         mgr IS NULL ) AS wurzel,
                ( SELECT IIf( count( * ) > 0, 'X' )
                  FROM   mitarbeiter
                  WHERE  mgr = m.ma_nr AND
                         m.mgr IS NOT NULL ) AS zweig,
                ( SELECT IIf( count( * ) > 0, 'X' )
                  FROM   mitarbeiter
                  WHERE  ( SELECT count( * )
                           FROM   mitarbeiter
	                   WHERE  mgr = m.ma_nr ) = 0 ) AS blatt
         FROM mitarbeiter AS m ) AS v
ORDER BY  2 DESC, 3 DESC, 1

Ohne die Unterabfrage v ist mir keine Sortierung gelungen.

Allgemeine Lösung

SELECT ma_name,
       ( SELECT CASE WHEN COUNT( * ) > 0 THEN 'X' ELSE NULL END
         FROM   mitarbeiter
         WHERE  ma_nr = m.ma_nr AND
                mgr IS NULL ) AS wurzel,
       ( SELECT CASE WHEN COUNT( * ) > 0 THEN 'X' ELSE NULL END
         FROM   mitarbeiter
         WHERE  mgr = m.ma_nr AND
                m.mgr IS NOT NULL ) AS zweig,
       ( SELECT CASE WHEN COUNT( * ) > 0 THEN 'X' ELSE NULL END
         FROM   mitarbeiter
         WHERE  ( SELECT COUNT( * ) FROM mitarbeiter
	          WHERE  mgr = m.ma_nr ) = 0 ) AS blatt
FROM   mitarbeiter AS m
ORDER  BY 2, 3, 1

Die Lösung kann in diesem DBFiddle eingesehen werden.

ma_name wurzel zweig blatt
König X    
Blank   X  
Fuhrmann   X  
Johann   X  
Kühne   X  
Scheidt   X  
Adam     X
Allard     X
Dreher     X
Jakobs     X
Mertens     X
Müller     X
Schmidt     X
Wecker     X



Zurück zur Übersicht