Comment fonctionne un CTE récursif, ligne par ligne ?
Les CTE récursifs, comme les UNION ALL sans fin, se composent d'un cas de base et de plusieurs appels récursifs. Considérez ce qui suit :
WITH rows AS ( SELECT * FROM mytable WHERE anchor_condition ), rows2 AS ( SELECT * FROM set_operation(mytable, rows) ), rows3 AS ( SELECT * FROM set_operation(mytable, rows2) ), … SELECT * FROM rows UNION ALL SELECT * FROM rows2 UNION ALL SELECT * FROM rows3 UNION ALL …
Dans l'exemple fourni :
WITH abcd1 AS ( SELECT * FROM @tbl t WHERE ParentId IS NULL ), abcd2 AS ( SELECT t.* FROM abcd1 JOIN @tbl t ON t.ParentID = abcd1.id ), abcd3 AS ( SELECT t.* FROM abcd2 JOIN @tbl t ON t.ParentID = abcd2.id ), abcd4 AS ( SELECT t.* FROM abcd3 JOIN @tbl t ON t.ParentID = abcd3.id ), abcd5 AS ( SELECT t.* FROM abcd4 JOIN @tbl t ON t.ParentID = abcd4.id ), abcd6 AS ( SELECT t.* FROM abcd5 JOIN @tbl t ON t.ParentID = abcd5.id ) SELECT * FROM abcd1 UNION ALL SELECT * FROM abcd2 UNION ALL SELECT * FROM abcd3 UNION ALL SELECT * FROM abcd4 UNION ALL SELECT * FROM abcd5 UNION ALL SELECT * FROM abcd6
Chaque itération d'ancrage génère un nouvel appel récursif, créant un ensemble de couches imbriquées. L'ancre est appelée une fois et sert de point de départ. Les itérations suivantes utilisent les résultats des appels précédents pour remplir le membre récursif.
Comme abcd6 ne renvoie aucun résultat, cela implique une condition d'arrêt. Théoriquement, les CTE récursifs peuvent être infinis, mais SQL Server impose une limite pour empêcher les jeux d'enregistrements infinis.
Reportez-vous à l'article suivant pour plus d'informations :
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!