Maison >base de données >tutoriel mysql >Comment puis-je effectuer des auto-jointures récursives dans SQL Server pour parcourir des données hiérarchiques ?

Comment puis-je effectuer des auto-jointures récursives dans SQL Server pour parcourir des données hiérarchiques ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-17 15:41:09203parcourir

How Can I Perform Recursive Self-Joins in SQL Server to Traverse Hierarchical Data?

Auto-jointure récursive SQL Server : une méthode simple

Dans la gestion de bases de données, l'auto-jointure récursive est une technologie qui permet aux tables de s'auto-joindre plusieurs fois, capable de parcourir des données hiérarchiques. Dans SQL Server, cela peut être réalisé via des requêtes récursives.

Considérons le scénario suivant : Nous avons un tableau appelé "Personne" avec les colonnes suivantes :

<code>PersonID | Initials | ParentID</code>

Le tableau représente une hiérarchie où chaque personne a une colonne « Initiales » et peut avoir un « ParentID » faisant référence à une autre personne.

Pour effectuer une auto-jointure récursive sur la table "Personne", nous pouvons utiliser une expression de table commune (CTE) comme indiqué ci-dessous :

<code class="language-sql">WITH q AS 
(
    SELECT  *
    FROM    Person
    WHERE   ParentID IS NULL 
    UNION ALL
    SELECT  m.*
    FROM    Person m
    JOIN    q
    ON      m.parentID = q.PersonID
)
SELECT  *
FROM    q</code>

Dans ce CTE :

  1. La requête initiale sélectionne toutes les lignes de la table "Person" dont le "ParentID" est NULL, représentant l'ancêtre ultime.
  2. La partie récursive du CTE sélectionne les lignes de la table "Person" dont le "ParentID" correspond au "PersonID" du CTE "q". Cette étape étend effectivement la hiérarchie.
  3. La requête finale sélectionne toutes les lignes du CTE "q", fournissant des données hiérarchiques.

Afin de conserver l'ordre de l'arbre, vous pouvez ajouter des conditions de tri dans la requête récursive, comme suit :

<code class="language-sql">WITH q AS 
(
    SELECT  m.*, CAST(ROW_NUMBER() OVER (ORDER BY m.PersonId) AS VARCHAR(MAX)) COLLATE Latin1_General_BIN AS bc
    FROM    Person m
    WHERE   ParentID IS NULL
    UNION ALL
    SELECT  m.*,  q.bc + '.' + CAST(ROW_NUMBER() OVER (PARTITION BY m.ParentID ORDER BY m.PersonID) AS VARCHAR(MAX)) COLLATE Latin1_General_BIN
    FROM    Person m
    JOIN    q
    ON      m.parentID = q.PersonID
)
SELECT  *
FROM    q
ORDER BY
        bc</code>

Vous pouvez contrôler l'ordre des éléments frères dans la hiérarchie en modifiant la condition ORDER BY.

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