2010-02-04 15 views

Répondre

8

L'équivalent SQL Server 2005+ de la syntaxe de requête hiérarchique CONNECT BY d'Oracle consiste à utiliser un CTE récursif. SQL Server 2008 a ajouté HierarchyID. Voici un exemple d'un CTE récursive:

WITH EmployeeHierarchy (EmployeeID, LastName, FirstName, ReportsTo, HierarchyLevel) AS (
    SELECT EmployeeID, 
      LastName, 
      FirstName, 
      ReportsTo, 
      1 as HierarchyLevel 
    FROM Employees 
    WHERE ReportsTo IS NULL 
    UNION ALL 
    -- Recursive step 
    SELECT e.EmployeeID, 
      e.LastName, 
      e.FirstName, 
      e.ReportsTo, 
      eh.HierarchyLevel + 1 AS HierarchyLevel 
    FROM Employees e 
    JOIN EmployeeHierarchy eh ON e.ReportsTo = eh.EmployeeID) 
    SELECT * 
    FROM EmployeeHierarchy 
ORDER BY HierarchyLevel, LastName, FirstName 

googler « CTE hiérarchique » et/ou « CTE récursive » se retrouvera de nombreux résultats. J'ai pris l'exemple de requête du 4GuysFromRolla.com.

Les CTE récursifs sont maintenant des standards ANSI - la syntaxe n'était pas supportée jusqu'à ce que je comprenne Oracle 11g.

+0

thx pour les liens et l'échantillon. – zapping

1

Le type de données HierarchyID est disponible dans MS SQL Server 2008, ce qui peut vous simplifier la vie.

+0

+1 pour le début de l'oiseau :) – zapping