Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 12.0.0 (Deutsch) » SQL Anywhere Server - SQL-Benutzerhandbuch » Daten abfragen und ändern » Allgemeine Tabellenausdrücke » Rekursive allgemeine Tabellenausdrücke

 

Hierarchische Daten auswählen

Je nachdem, wie Sie die Abfrage schreiben, kann es sinnvoll sein, die Anzahl der Rekursionsstufen zu beschränken. Mit der Beschränkung der Anzahl der Stufen können Sie beispielsweise nur die obersten Managementebenen zurückgeben, was aber möglicherweise einige Mitarbeiter ausschließt, wenn die Hierarchie verzweigter ist, als Sie angenommen haben. Wenn Sie für die Anzahl der Stufen keine Beschränkung festlegen, wird garantiert, dass kein Mitarbeiter ausgeschlossen wird, aber es kann zu unendlichen Rekursionen führen, falls die Ausführung Schleifen erfordert, wenn z.B. ein Mitarbeiter direkt oder indirekt sich selbst unterstellt ist. Das könnte in der Managementhierarchie einer Firma eintreten, wenn beispielsweise ein Angestellter der Firma auch im Vorstand sitzt.

Die folgende Abfrage zeigt, wie Sie die Mitarbeiter anhand ihrer Managementebene auflisten. Ebene 0 stellt Mitarbeiter ohne Vorgesetzte dar. Ebene 1 stellt Mitarbeiter dar, die direkt einem Vorgesetzten der Ebene 0 unterstellt sind, Ebene 2 stellt Mitarbeiter dar, die direkt einem Vorgesetzten der Ebene 1 unterstellt sind, und so weiter.



WITH RECURSIVE
  manager ( EmployeeID, ManagerID,
            GivenName, Surname, mgmt_level ) AS
( ( SELECT EmployeeID, ManagerID,       -- initial subquery
           GivenName, Surname, 0
    FROM Employees AS e
    WHERE ManagerID = EmployeeID )
  UNION ALL
  ( SELECT e.EmployeeID, e.ManagerID,   -- recursive subquery
           e.GivenName, e.Surname, m.mgmt_level + 1
    FROM Employees AS e JOIN manager AS m
     ON   e.ManagerID =  m.EmployeeID
      AND e.ManagerID <> e.EmployeeID
      AND m.mgmt_level < 20 ) )
SELECT * FROM manager
ORDER BY mgmt_level, Surname, GivenName;

Die Bedingung innerhalb der rekursiven Abfrage, mit der die Managementebenen auf weniger als 20 beschränkt wird, ist eine wichtige Vorsichtsmaßnahme. Sie verhindert eine unendliche Rekursion, falls die Tabellendaten eine Schleife enthalten.

 max_recursive_iterations-Option