Rekursive Common Table Expressions (CTEs) sind ein leistungsstarkes Instrument in SQL zur Abfrage hierarchischer Daten wie Organisationsdiagramme, Dateisysteme oder Billing-of-Materials. Sie ermöglichen es Ihnen, eine Baumstruktur zu durchqueren, indem Sie den CTE selbst innerhalb seiner Definition wiederholt verweisen. Die Grundstruktur umfasst ein Ankerelement (die anfängliche Abfrage) und ein rekursives Mitglied (der Selbstreferenzenteil).
Veranschaulichen wir ein einfaches Beispiel für ein Organisationsdiagramm in einer Tabelle mit dem Namen employees
:
<code class="sql">CREATE TABLE employees ( employee_id INT PRIMARY KEY, employee_name VARCHAR(255), manager_id INT ); INSERT INTO employees (employee_id, employee_name, manager_id) VALUES (1, 'CEO', NULL), (2, 'VP Sales', 1), (3, 'Sales Rep 1', 2), (4, 'Sales Rep 2', 2), (5, 'VP Marketing', 1), (6, 'Marketing Manager', 5);</code>
Um die gesamte Hierarchie unter dem CEO abzurufen (Employee_ID 1), verwenden wir einen rekursiven CTE:
<code class="sql">WITH RECURSIVE EmployeeHierarchy AS ( -- Anchor member: Selects the CEO SELECT employee_id, employee_name, manager_id, 0 as level FROM employees WHERE employee_id = 1 UNION ALL -- Recursive member: Joins with itself to find subordinates SELECT e.employee_id, e.employee_name, e.manager_id, eh.level 1 FROM employees e INNER JOIN EmployeeHierarchy eh ON e.manager_id = eh.employee_id ) SELECT * FROM EmployeeHierarchy;</code>
Diese Abfrage beginnt mit dem CEO und fügt rekursiv Untergebene hinzu, bis keine Mitarbeiter mehr zu den bereits eingeschlossenen Mitarbeitern berichten. Die Spalte level
zeigt die Tiefe in der Hierarchie an. Die UNION ALL
die Ergebnisse des Anker- und rekursiven Mitglieder. Der Schlüssel ist die Selbstjagd zwischen employees
und EmployeeHierarchy
im rekursiven Mitglied und verbindet jeden Mitarbeiter mit seinem Manager.
Mehrere Fallstricke können bei der Arbeit mit rekursiven CTEs zu falschen Ergebnissen oder Leistungsproblemen führen:
NULL
in einer übergeordneten ID -Spalte) oder durch Begrenzung der Rekursionstiefe.UNION ALL
anstelle von UNION
wird doppelte Zeilen enthalten, wenn sie in der Hierarchie existieren. Verwenden Sie UNION
, wenn Sie Duplikate beseitigen müssen. UNION ALL
ist jedoch allgemein schneller.Rekursive CTEs können in sehr großen hierarchischen Datensätzen langsam sein. Mehrere Optimierungsstrategien können die Leistung verbessern:
WHERE
Klauseln zum Anker und/oder rekursiven Mitgliedern unnötige Zweige der Hierarchie herausfiltern. Dies reduziert die Menge der verarbeiteten Daten.Rekursive CTEs werden von den meisten wichtigen Datenbanksystemen unterstützt, die Syntax kann jedoch geringfügig variieren:
WITH RECURSIVE
(obwohl das RECURSIVE
Schlüsselwort optional ist).WITH RECURSIVE
.START WITH
und CONNECT BY
Klauseln, die eine etwas andere Syntax haben, aber die gleiche Funktionalität erreichen.Während das Kernkonzept in verschiedenen Systemen gleich bleibt, wenden Sie sich immer an die Dokumentation Ihres spezifischen Datenbanksystems für die richtige Syntax und alle systemspezifischen Einschränkungen oder Optimierungen. Denken Sie daran, Ihre Abfragen gründlich zu testen und ihre Leistung zu profilieren, um Engpässe zu identifizieren und zu beheben.
Das obige ist der detaillierte Inhalt vonWie verwende ich rekursive CTEs in SQL, um hierarchische Daten abzufragen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!