Erstellen einer rekursiven CTE
In diesem Schritt lernen Sie, wie Sie eine rekursive Common Table Expression (CTE) in SQLite erstellen und verwenden. Rekursive CTEs werden verwendet, um hierarchische oder baumartige Daten abzufragen. Sie ermöglichen es Ihnen, Beziehungen innerhalb einer Tabelle zu durchlaufen und Daten auf verschiedenen Ebenen der Hierarchie abzurufen.
Eine rekursive CTE ist eine CTE, die sich selbst referenziert. Sie besteht aus zwei Teilen:
- Anker-Member (Anchor Member): Die anfängliche
SELECT
-Anweisung, die den Basisfall oder den Startpunkt der Rekursion definiert.
- Rekursiver Member (Recursive Member): Eine
SELECT
-Anweisung, die sich auf die CTE selbst bezieht. Dieser Teil führt den rekursiven Schritt aus und baut auf den Ergebnissen der vorherigen Iteration auf.
Der Anker-Member und der rekursive Member werden mit dem Operator UNION ALL
kombiniert. Die Rekursion wird fortgesetzt, bis der rekursive Member eine leere Ergebnismenge zurückgibt.
Erstellen wir zunächst eine Tabelle namens employees_hierarchy
mit der folgenden Struktur:
CREATE TABLE employees_hierarchy (
id INTEGER PRIMARY KEY,
name TEXT,
manager_id INTEGER,
title TEXT
);
Diese Tabelle stellt die Mitarbeiterhierarchie dar, wobei manager_id
sich auf die id
des Managers des Mitarbeiters bezieht. Führen Sie den obigen Befehl an der sqlite>
-Eingabeaufforderung aus.
Fügen Sie als Nächstes einige Beispieldaten in die Tabelle employees_hierarchy
ein:
INSERT INTO employees_hierarchy (name, manager_id, title) VALUES ('Alice', NULL, 'CEO');
INSERT INTO employees_hierarchy (name, manager_id, title) VALUES ('Bob', 1, 'VP of Marketing');
INSERT INTO employees_hierarchy (name, manager_id, title) VALUES ('Charlie', 1, 'VP of Sales');
INSERT INTO employees_hierarchy (name, manager_id, title) VALUES ('David', 2, 'Marketing Manager');
INSERT INTO employees_hierarchy (name, manager_id, title) VALUES ('Eve', 3, 'Sales Manager');
INSERT INTO employees_hierarchy (name, manager_id, title) VALUES ('Frank', 4, 'Marketing Specialist');
INSERT INTO employees_hierarchy (name, manager_id, title) VALUES ('Grace', 5, 'Sales Representative');
Hier ist Alice die CEO (kein Manager), Bob und Charlie berichten an Alice, David berichtet an Bob, Eve berichtet an Charlie, Frank berichtet an David und Grace berichtet an Eve. Führen Sie die obigen Befehle an der sqlite>
-Eingabeaufforderung aus.
Erstellen wir nun eine rekursive CTE, um die gesamte Hierarchie unter Alice (der CEO) abzurufen. Führen Sie die folgende SQL-Anweisung aus:
WITH RECURSIVE
EmployeeHierarchy(id, name, manager_id, title, level) AS (
-- Anchor member: Select the CEO
SELECT id, name, manager_id, title, 0 AS level
FROM employees_hierarchy
WHERE manager_id IS NULL
UNION ALL
-- Recursive member: Select employees reporting to the current level
SELECT e.id, e.name, e.manager_id, e.title, eh.level + 1
FROM employees_hierarchy e
JOIN EmployeeHierarchy eh ON e.manager_id = eh.id
)
SELECT id, name, title, level
FROM EmployeeHierarchy;
Diese Abfrage definiert eine rekursive CTE namens EmployeeHierarchy
. Der Anker-Member wählt den CEO aus (wobei manager_id
NULL ist). Der rekursive Member verbindet die Tabelle employees_hierarchy
mit der EmployeeHierarchy
-CTE, um Mitarbeiter zu finden, die an die Mitarbeiter berichten, die in der vorherigen Ebene ausgewählt wurden. Die Spalte level
verfolgt die Tiefe in der Hierarchie.
Erwartete Ausgabe:
1|Alice|CEO|0
2|Bob|VP of Marketing|1
3|Charlie|VP of Sales|1
4|David|Marketing Manager|2
5|Eve|Sales Manager|2
6|Frank|Marketing Specialist|3
7|Grace|Sales Representative|3
Dies zeigt die gesamte Mitarbeiterhierarchie, wobei die level
die Berichtsebene angibt.