Construire une CTE récursive
Dans cette étape, vous apprendrez à construire et à utiliser une expression de table commune (Common Table Expression - CTE) récursive dans SQLite. Les CTE récursives sont utilisées pour interroger des données hiérarchiques ou structurées en arborescence. Elles vous permettent de parcourir les relations au sein d'une table et de récupérer des données à différents niveaux de la hiérarchie.
Une CTE récursive est une CTE qui se réfère à elle-même. Elle se compose de deux parties :
- Membre d'ancrage (Anchor Member) : L'instruction
SELECT
initiale qui définit le cas de base ou le point de départ de la récursion.
- Membre récursif (Recursive Member) : Une instruction
SELECT
qui fait référence à la CTE elle-même. Cette partie effectue l'étape récursive, en s'appuyant sur les résultats de l'itération précédente.
Le membre d'ancrage et le membre récursif sont combinés à l'aide de l'opérateur UNION ALL
. La récursion se poursuit jusqu'à ce que le membre récursif renvoie un ensemble de résultats vide.
Tout d'abord, créons une table nommée employees_hierarchy
avec la structure suivante :
CREATE TABLE employees_hierarchy (
id INTEGER PRIMARY KEY,
name TEXT,
manager_id INTEGER,
title TEXT
);
Cette table représente la hiérarchie des employés, où manager_id
fait référence à l'id
du responsable de l'employé. Exécutez la commande ci-dessus à l'invite sqlite>
.
Ensuite, insérez des exemples de données dans la table employees_hierarchy
:
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');
Ici, Alice est la PDG (pas de responsable), Bob et Charlie rendent compte à Alice, David rend compte à Bob, Eve rend compte à Charlie, Frank rend compte à David et Grace rend compte à Eve. Exécutez les commandes ci-dessus à l'invite sqlite>
.
Maintenant, construisons une CTE récursive pour récupérer toute la hiérarchie sous Alice (la PDG). Exécutez l'instruction SQL suivante :
WITH RECURSIVE
EmployeeHierarchy(id, name, manager_id, title, level) AS (
-- Anchor member: Select the CEO (Membre d'ancrage : Sélectionner le PDG)
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 (Membre récursif : Sélectionner les employés qui rendent compte au niveau actuel)
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;
Cette requête définit une CTE récursive nommée EmployeeHierarchy
. Le membre d'ancrage sélectionne le PDG (où manager_id
est NULL). Le membre récursif joint la table employees_hierarchy
à la CTE EmployeeHierarchy
pour trouver les employés qui rendent compte aux employés sélectionnés au niveau précédent. La colonne level
suit la profondeur dans la hiérarchie.
Résultat attendu :
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
Cela montre toute la hiérarchie des employés, avec le level
indiquant le niveau hiérarchique.