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
Libérer: 2025-01-15 12:01:47
original
303 Les gens l'ont consulté

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 :

CREATE TABLE Categories (
  Id int PRIMARY KEY,
  Name nvarchar(MAX),
  ParentId int FOREIGN KEY REFERENCES Categories(Id)
);
Copier après la connexion

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 :

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

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 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