Exécution de CTE récursives, ligne par ligne
Les expressions de table communes récursives (CTE) sont de puissantes constructions SQL qui permettent des requêtes récursives. Pour comprendre comment ils s'exécutent, considérez-les comme une série d'opérations UNION ALL.
Considérez l'exemple fourni :
DECLARE @tbl TABLE ( Id INT , [Name] VARCHAR(20) , ParentId INT );
Ligne 1-2 : Définir la table structure.
Ligne 3-16 : Insérer les enregistrements dans le table.
Ligne 19-24 : Définir le CTE récursif abcd.
Ligne 19 : L'expression d'ancrage définit l'itération initiale du CTE en sélectionnant les enregistrements où ParentId est NULL.
Ligne 20-22 : L'expression récursive étend le CTE en sélectionnant les enregistrements enfants et en concaténant leurs noms avec le chemin du parent dans la colonne Chemin.
Ligne 25 : Sélectionnez dans le CTE abcd pour récupérer le résultat final.
Exécution Étapes :
1. Exécutez l'expression d'ancrage (ligne 19), qui renvoie le résultat suivant :
Id | Name | ParentId | Path |
---|---|---|---|
1 | Europe | NULL | Europe |
2 | Asia | NULL | Asia |
2. Exécutez l'expression récursive (lignes 20-22) en utilisant le résultat de l'expression d'ancrage. Cela donne :
Id | Name | ParentId | Path |
---|---|---|---|
3 | Germany | 1 | Europe/Germany |
4 | UK | 1 | Europe/UK |
5 | China | 2 | Asia/China |
6 | India | 2 | Asia/India |
3. Répétez l'étape 2 jusqu'à ce qu'aucun enregistrement enfant ne soit trouvé, ce qui donne :
Id | Name | ParentId | Path |
---|---|---|---|
7 | Scotland | 4 | Europe/UK/Scotland |
8 | Edinburgh | 7 | Europe/UK/Scotland/Edinburgh |
9 | Leith | 8 | Europe/UK/Scotland/Edinburgh/Leith |
4. Unionnez tous les résultats de chaque itération pour obtenir le résultat final affiché dans l'instruction SELECT (ligne 25).
Pourquoi l'ancre n'est pas répétée :
L'expression d'ancrage définit le point de départ initial de la récursivité. Bien qu'elle soit exécutée à chaque itération, elle est distincte de l'expression récursive, qui étend le jeu de résultats. Ainsi, les enregistrements d'ancrage ne sont inclus qu'une seule fois.
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!