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
Libérer: 2025-01-17 15:41:09
original
202 Les gens l'ont consulté

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

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

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

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!

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