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
Libérer: 2025-01-01 09:31:09
original
367 Les gens l'ont consulté

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
…
Copier après la connexion

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
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal