Maison >base de données >SQL >Comment utiliser les CTES récursives dans SQL pour interroger les données hiérarchiques?
Cet article explique les expressions de table courantes récursives de SQL (CTES) pour interroger les données hiérarchiques. Il détaille leur structure, en utilisant un exemple de graphique organisationnel, et traite des pièges communs comme une récursivité infinie et des jointures incorrectes. Opti
Les expressions de table courantes récursives (CTES) sont un outil puissant en SQL pour interroger les données hiérarchiques, telles que les graphiques organisationnels, les systèmes de fichiers ou les matériaux. Ils vous permettent de traverser une structure en forme d'arbre en faisant référence à plusieurs reprises le CTE lui-même dans sa définition. La structure de base implique un membre d'ancrage (la requête initiale) et un membre récursif (la partie d'auto-références).
Illustrons avec un exemple simple d'un tableau organisationnel représenté dans un tableau nommé 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>
Pour récupérer toute la hiérarchie sous le PDG (Employee_ID 1), nous utilisons un CTE récursif:
<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>
Cette requête commence par le PDG et ajoute récursivement des subordonnés jusqu'à ce que plus d'employés ne relèvent de ceux déjà inclus. La colonne level
indique la profondeur de la hiérarchie. Le UNION ALL
les résultats de l'ancre et des membres récursifs. La clé est l'auto-jointe entre employees
et EmployeeHierarchy
chez le membre récursif, reliant chaque employé à leur gestionnaire.
Plusieurs pièges peuvent conduire à des résultats incorrects ou à des problèmes de performances lorsque vous travaillez avec des CTES récursifs:
NULL
dans une colonne d'identification parent) ou en limitant la profondeur de récursivité.UNION ALL
au lieu d' UNION
comprendra des lignes en double si elles existent dans la hiérarchie. Utilisez UNION
si vous devez éliminer les doublons. Cependant, UNION ALL
est généralement plus rapide.Les CTES récursifs peuvent être lents sur de très grands ensembles de données hiérarchiques. Plusieurs stratégies d'optimisation peuvent améliorer les performances:
WHERE
les clauses à l'ancre et / ou aux membres récursifs pour filtrer les branches inutiles de la hiérarchie. Cela réduit la quantité de données traitées.Les CTES récursifs sont pris en charge par la plupart des principaux systèmes de base de données, mais la syntaxe peut varier légèrement:
WITH RECURSIVE
(bien que le mot clé RECURSIVE
soit facultatif).WITH RECURSIVE
.START WITH
et CONNECT BY
les clauses, qui ont une syntaxe légèrement différente mais obtiennent la même fonctionnalité.Bien que le concept de base reste le même sur différents systèmes, consultez toujours la documentation de votre système de base de données spécifique pour la syntaxe correcte et toutes les limitations ou optimisations spécifiques au système. N'oubliez pas de tester soigneusement vos requêtes et de profiler leurs performances pour identifier et traiter les goulots d'étranglement.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!