Maison >base de données >tutoriel mysql >Comment un CTE récursif s'exécute-t-il ligne par ligne dans SQL Server ?

Comment un CTE récursif s'exécute-t-il ligne par ligne dans SQL Server ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-30 09:52:10353parcourir

How Does a Recursive CTE Execute Line by Line in SQL Server?

Exécution ligne par ligne d'un CTE récursif

Les expressions de table communes (CTE) récursives sont souvent difficiles à comprendre, mais elles peuvent être compris en décomposant leur ligne d'exécution par line.

Anchor

SELECT  id, Name, ParentID, CAST(Name AS VARCHAR(1000)) AS Path
FROM    @tbl
WHERE   ParentId IS NULL
  • L'ancre sélectionne les nœuds de niveau supérieur, où ParentId est NULL.
  • Il projette le colonnes suivantes : id, Name, ParentID et une colonne Path initialisée avec le nœud name.

Membre récursif

SELECT  t.id, t.Name, t.ParentID, CAST((a.path + '/' + t.Name) AS VARCHAR(1000)) AS "Path"
FROM    @tbl AS t
JOIN    abcd AS a
ON      t.ParentId = a.id
  • Le membre récursif sélectionne les nœuds enfants en joignant la table temporaire abcd avec @tbl en fonction de ParentId.
  • Il ajoute le nom du nœud enfant au nom du nœud parent. Chemin.

UNION ALL sans fin

Pensez au CTE récursif comme un UNION ALL sans fin qui s'étend horizontalement, ajoutant de nouveaux niveaux de hiérarchie à chaque itération. Par exemple, abcd2 inclurait les nœuds enfants de abcd1, abcd3 inclurait les nœuds enfants de abcd2, et ainsi de suite.

Chaque itération

  • L'ancre n'est jamais ignoré dans les itérations ultérieures. Il sélectionne toujours les nœuds de niveau supérieur.
  • Le membre récursif joint les nœuds enfants aux nœuds précédemment sélectionnés, créant ainsi une structure hiérarchique.
  • À mesure que chaque itération progresse, la colonne Chemin est mise à jour pour refléter les bonnes relations parent-enfant.

Arrêter Condition

Théoriquement, un CTE récursif peut s'exécuter indéfiniment. Toutefois, SQL Server empêche les jeux d'enregistrements infinis en implémentant une condition d'arrêt. Lorsqu'un membre récursif ne parvient pas à produire de nouvelles lignes, l'itération s'arrête.

Dans cet exemple, lorsque le membre récursif ne parvient pas à trouver des nœuds enfants pour le niveau abcd6, l'itération se termine.

Résultat final

Le résultat final est un arbre hiérarchique complet, commençant par les nœuds de niveau supérieur et s'étendant jusqu'à les niveaux les plus bas. La colonne Chemin fournit le chemin complet vers chaque nœud de la hiérarchie.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn