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

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

Barbara Streisand
Barbara Streisandoriginal
2025-01-15 12:01:47224parcourir

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

Récupération efficace de données hiérarchiques avec des auto-jointures récursives dans SQL Server

La navigation dans les structures de données hiérarchiques peut être complexe. L'expression de table commune (CTE) récursive de SQL Server offre une solution puissante pour parcourir ces structures arborescentes à l'aide d'auto-jointures.

Comprendre le défi

Considérons un modèle de données hiérarchique typique, tel qu'une table de catégories :

<code class="language-sql">CREATE TABLE Categories (
  Id int PRIMARY KEY,
  Name nvarchar(MAX),
  ParentId int FOREIGN KEY REFERENCES Categories(Id)
);</code>

Cette conception permet des catégories imbriquées de profondeur arbitraire. La visualisation de cette hiérarchie (comme indiqué ci-dessous) met en évidence la difficulté de récupérer des lignées complètes avec des requêtes SQL standard.

[Insérer une image de la hiérarchie des catégories]

La solution CTE récursive

Un CTE récursif résout élégamment ce problème. La requête suivante montre comment récupérer une catégorie et l'intégralité de son ascendance :

<code class="language-sql">WITH RecursiveCategoryCTE AS (
  SELECT
    c.Id,
    c.Name,
    CAST(c.Name AS nvarchar(MAX)) AS Path
  FROM Categories AS c
  WHERE
    c.ParentId IS NULL
  UNION ALL
  SELECT
    t.Id,
    t.Name,
    CAST(r.Path + ',' + t.Name AS nvarchar(MAX)) AS Path
  FROM RecursiveCategoryCTE AS r
  JOIN Categories AS t
    ON t.ParentId = r.Id
)
SELECT
  c.Id,
  c.Name,
  c.Path
FROM RecursiveCategoryCTE AS c
WHERE
  c.Name = 'Business Laptops';</code>

Répartition des requêtes

  • Le CTE, RecursiveCategoryCTE, commence par sélectionner les catégories racines (où ParentId est NULL).
  • Il rejoint récursivement la table Categories, construisant la colonne Path pour accumuler les noms d'ancêtres.
  • L'instruction finale SELECT filtre la catégorie cible (« ordinateurs portables professionnels ») et son chemin d'ascendance généré.

Le résultat serait :

Id Name Path
12 Business Laptops Computers,Laptops,Business Laptops

Applications du monde réel

Cette technique est précieuse dans de nombreuses applications, notamment :

  • Organigrammes
  • Navigation sur le site e-commerce (fil d'Ariane)
  • Bases de données généalogiques (arbres généalogiques)

Cette approche fournit une méthode concise et efficace pour parcourir les données hiérarchiques au sein de SQL Server.

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