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

SQL Anywhere 11.0.1 (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

Die Option max_recursive_iterations dient dazu, endlos laufende rekursive Abfragen zu verhindern. Der Standardwert für diese Option ist 100. Rekursive Abfragen, die diese Anzahl von Stufen übersteigen, werden abgeschlossen, bewirken aber einen Fehler.

Auch wenn diese Option scheinbar die Bedeutung einer Stop-Bedingung vermindert, ist das nicht der Fall. Die Anzahl der bei jeder Wiederholung ausgewählten Zeilen kann exponential wachsen, was ernsthafte Auswirkung auf die Datenbank-Performance haben kann, bevor das Maximum erreicht ist. Stop-Bedingungen in rekursiven Abfragen sind eine Möglichkeit, entsprechende Grenzen in solchen Situationen zu setzen.