2010-02-04 12 views

risposta

8

L'equivalente SQL Server 2005+ della sintassi di query gerarchica Oracle CONNECT BY consiste nell'utilizzare un CTE ricorsivo. SQL Server 2008 ha aggiunto HierarchyID. Ecco un esempio di una CTE ricorsiva:

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 

Googling "gerarchica CTE" e/o "CTE ricorsiva" storceranno numerosi risultati. Ho preso la query di esempio dal 4GuysFromRolla.com.

Le CTE recursive sono ora standard ANSI: la sintassi non è stata supportata fino a Oracle 11g, come ho capito.

+0

thx per i collegamenti e il campione. – zapping

1

C'è il tipo di dati HierarchyID in MS SQL Server 2008, che può semplificarti la vita.

+0

+1 per l'early bird :) – zapping

Problemi correlati