Toutoune DevZone

.NET (C#)

Requêtes SQL récursives

Voici une nouvelle fonctionnalité qu'offre Microsoft SQL 2005 et que je viens de découvrir : les requêtes récursives grâce aux  "Common Table Expressions" (CTE).

Ces requêtes permettent de manipuler des hierarchies de données (Parent => Enfants) comme des catégories > sous-catégories > ... > sous-catégories.
La syntaxe est la suivante :

WITH cte_name ( column_name [,...n] )
AS
(

Requête de définition

UNION ALL

Requête récursive

)

Requête utilisant cte_name

La requête de définition reprend les colonnes spécifiées en argument de la CTE et décrit l'élément parent, l'élément de départ de la requête.

La requête récursive permet de définir la manière d'accéder aux enfants. Pour la construire, il suffit de faire référence à la CTE comme s'il sagissait d'une table ou d'une vue. Voici un exemple tiré de la MSDN :

WITH DirectReports (ManagerID, EmployeeID, Title, DeptID, Level)
AS
(
    -- Anchor member definition
    SELECT e.ManagerID, e.EmployeeID, e.Title, edh.DepartmentID,
           0 AS Level
      FROM HumanResources.Employee AS e
     INNER JOIN HumanResources.EmployeeDepartmentHistory AS edh
        ON e.EmployeeID = edh.EmployeeID AND edh.EndDate IS NULL
     WHERE ManagerID IS NULL

    UNION ALL

    -- Recursive member definition
    SELECT e.ManagerID, e.EmployeeID, e.Title, edh.DepartmentID,
           Level + 1
      FROM HumanResources.Employee AS e
     INNER JOIN HumanResources.EmployeeDepartmentHistory AS edh
        ON e.EmployeeID = edh.EmployeeID AND edh.EndDate IS NULL
     INNER JOIN DirectReports AS d
        ON e.ManagerID = d.EmployeeID
)

-- Statement that executes the CTE
SELECT ManagerID, EmployeeID, Title, Level
  FROM DirectReports
 INNER JOIN HumanResources.Department AS dp
    ON DirectReports.DeptID = dp.DepartmentID
 WHERE dp.GroupName = N'Research and Development' OR Level = 0;
GO

Pour plus de détails, voici la référence dans la MSDN :
Source : http://msdn2.microsoft.com/en-us/library/ms186243.aspx

Posted: oct. 16 2006, 11:20 par Toutoune_31 | avec 5 comment(s)
Classé sous :

Commentaires

Vko a dit :

Coupler aux fonctions de ranking on peut faire des choses merveilleuses avec tout ca.

Les CTE s'est l'avenir de l'homme de toute façon :p

# octobre 17, 2006 8:41

Toutoune_31 a dit :

Et n'oublions pas la génération automatique d'XML !

C'est assez énorme aussi ;)

# octobre 18, 2006 10:52

Toutoune_31 a dit :

Un lien intéressant vers la liste des nouveautés SQL 2005 :

http://www.microsoft.com/france/sql/sql2005/decouvrez/fonctionnalites.mspx

# octobre 20, 2006 10:46

Frédéric Brouard a dit :

Pour plus de détails, lisez l'article que j'ai écrit sur la récusivité avec les CTE dans MS SQL Server 2005. Vous verrez comment résoudre un problème complexe : trouver le meilleur chemin dans un graphe (et d'autres choses comme la concaténation....) :

sqlpro.developpez.com/.../cte-recursives

A +

# janvier 13, 2008 11:25

Toutoune_31 a dit :

Article très intéressant, merci pour le lien.

# février 14, 2008 2:08
Laissez un commentaire

(requis) 

(requis) 

(optionel(le))

(requis)