Les expressions de table courantes récursives (CTES) sont des outils puissants dans SQL utilisés pour gérer les structures de données hiérarchiques comme les graphiques organisationnels, les systèmes de fichiers ou les arbres de catégorie. Voici un guide étape par étape sur la façon de les utiliser:
Définir le membre de l'ancre: La première partie d'un CTE récursive est le membre de l'ancre, qui définit le point de départ de la récursivité. Il s'agit d'une requête non cerveuse qui renvoie un ensemble de lignes initiales.
<code class="sql">WITH RECURSIVE EmployeeHierarchy AS ( SELECT id, name, manager_id, 0 AS level FROM Employees WHERE manager_id IS NULL -- Start from the top level (eg, CEO)</code>
Définir le membre récursif: Suite au membre de l'ancrage, le membre récursif définit comment le recursion se déroule. Il fait référence au CTE lui-même pour s'appuyer sur les lignes renvoyées de l'itération précédente.
UNION ALL SELECT e.id, e.name, e.manager_id, level 1 FROM Employees e INNER JOIN EmployeeHierarchy m ON e.manager_id = m.id )
Combinez les résultats: le CTE récursif continue de s'appuyer sur lui-même jusqu'à ce qu'aucune nouvelle ligne ne soit générée. Vous interrogez ensuite le CTE pour obtenir les résultats souhaités.
<code class="sql">SELECT id, name, level FROM EmployeeHierarchy;</code>
Cet exemple construit une hiérarchie des employés à partir du haut (où manager_id
est NULL
) et ajoute récursivement des subordonnés à chaque niveau jusqu'à ce que tous les employés soient inclus.
L'optimisation des CTES récursives implique plusieurs stratégies pour améliorer les performances et réduire l'utilisation des ressources:
Limitez la profondeur de la récursivité: soyez conscient de la profondeur de votre récursivité. Si possible, implémentez une clause WHERE
enfiler la profondeur maximale.
<code class="sql">WHERE level < 10</code>
manager_id
et id
dans le tableau Employees
.Lorsque vous travaillez avec des CTES récursives, vous pouvez rencontrer plusieurs types d'erreurs. Voici quelques problèmes communs et comment les dépanner:
Boucles infinies: si la partie récursive du CTE continue de se référencer sans condition d'arrêt, elle peut provoquer une boucle infinie. Assurez-vous que votre récursivité a une condition de terminaison claire.
<code class="sql">WHERE level < 10</code>
UNION ALL
, et la référence récursive doit être dans la clause de l'élément FROM
.Bien que les CET récursifs soient puissants pour gérer les données hiérarchiques, il existe d'autres méthodes qui peuvent être plus appropriées en fonction de votre cas d'utilisation spécifique:
Modèle de liste d'adjacence: ce modèle stocke la relation parent-enfant immédiate. Il est simple mais peut nécessiter plusieurs requêtes ou auto-joins pour naviguer dans la hiérarchie.
<code class="sql">CREATE TABLE Employees ( id INT PRIMARY KEY, name VARCHAR(100), manager_id INT, FOREIGN KEY (manager_id) REFERENCES Employees(id) );</code>
Chemin matérialisé: ce modèle stocke tout le chemin de la racine à chaque nœud sous forme de chaîne. Il est bon pour la récupération rapide des chemins entiers, mais peut devenir complexe avec des mises à jour fréquentes.
<code class="sql">CREATE TABLE Categories ( id INT PRIMARY KEY, name VARCHAR(100), path VARCHAR(1000) );</code>
Ensembles imbriqués: ce modèle attribue des valeurs gauche et droite à chaque nœud, qui peut être utilisé pour déterminer efficacement les relations parent-enfant. C'est bon pour les requêtes qui doivent traverser les hiérarchies rapidement mais peuvent être difficiles à mettre à jour.
<code class="sql">CREATE TABLE Categories ( id INT PRIMARY KEY, name VARCHAR(100), lft INT, rgt INT );</code>
Tableau de fermeture: Ce modèle stocke toutes les relations ancêtres-descendantes, ce qui le rend efficace pour les requêtes impliquant des chemins mais nécessitant plus d'espace de stockage.
<code class="sql">CREATE TABLE EmployeeHierarchy ( ancestor INT, descendant INT, PRIMARY KEY (ancestor, descendant), FOREIGN KEY (ancestor) REFERENCES Employees(id), FOREIGN KEY (descendant) REFERENCES Employees(id) );</code>
Chacun de ces modèles a ses forces et ses faiblesses, et le choix dépend des besoins spécifiques de votre application, y compris le type de requêtes que vous devez effectuer et la fréquence des changements de données.
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!