Maison >base de données >tutoriel mysql >Comment les auto-jointures récursives dans SQL Server peuvent-elles naviguer efficacement dans les données hiérarchiques ?

Comment les auto-jointures récursives dans SQL Server peuvent-elles naviguer efficacement dans les données hiérarchiques ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-17 15:31:11114parcourir

How Can Recursive Self-Joins in SQL Server Efficiently Navigate Hierarchical Data?

Auto-jointures récursives dans SQL Server

Dans SQL Server, une auto-jointure récursive vous permet de naviguer dans des structures de données hiérarchiques en joignant un table à elle-même plusieurs fois en fonction d'une relation parent-enfant.

Pour effectuer une auto-jointure récursive pour récupérer les enregistrements liés à un élément spécifique hiérarchie, la stratégie suivante peut être utilisée :

Utilisation d'une expression de table commune (CTE)

Une CTE, également connue sous le nom de requête récursive, peut être utilisée pour implémenter une auto-jointure récursive. L'idée principale est de définir une requête d'ancrage qui sélectionne les enregistrements qui répondent à un critère spécifique (par exemple, aucun parent), puis d'utiliser une sous-requête récursive pour ajouter les enregistrements enfants aux résultats :

WITH q AS 
(
    SELECT  *
    FROM    mytable
    WHERE   ParentID IS NULL
    UNION ALL
    SELECT  m.*
    FROM    mytable m
    JOIN    q
    ON      m.parentID = q.PersonID
)
SELECT  *
FROM    q

En ajoutant un ordre condition à la sous-requête récursive, l'ordre de l'arborescence peut être préservé :

WITH    q AS 
(
    SELECT  m.*, CAST(ROW_NUMBER() OVER (ORDER BY m.PersonId) AS VARCHAR(MAX)) COLLATE Latin1_General_BIN AS bc
    FROM    mytable 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    mytable m
    JOIN    q
    ON      m.parentID = q.PersonID
)
SELECT  *
FROM    q
ORDER BY
        bc

Considérations :

  • La requête d'ancrage doit sélectionner les enregistrements qui représentent la racine de la hiérarchie que vous souhaitez parcourir.
  • La sous-requête récursive doit joindre les enregistrements enfants aux enregistrements parents en utilisant la colonne de relation parent-enfant appropriée.
  • Vous pouvez ajouter des colonnes à la sous-requête récursive pour suivre les informations de niveau ou de chemin si nécessaire.

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