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

Comment un CTE récursif s'exécute-t-il étape par étape ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-01 09:31:09368parcourir

How Does a Recursive CTE Execute Step-by-Step?

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 :

  • [SQL Server : les CTE récursifs sont-ils CTE est vraiment basé sur un ensemble ?](https://www.sqlshack.com/sql-server-recursive-ctes-really-set-based/)

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