Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie entwerfe ich eine rekursive SQL-Abfrage?

Siehe:

Aktualisierung:

Ein richtiger rekursiver CTE besteht im Wesentlichen aus drei Dingen:

  • ein Anker SELECT zunächst; das kann z.b. die Mitarbeiter der Root-Ebene (wobei die Reports_To ist NULL), oder es kann einen beliebigen Mitarbeiter auswählen, den Sie definieren, z. durch einen Parameter

  • a UNION ALL

  • eine rekursive SELECT Anweisung, die aus derselben, normalerweise selbstreferenzierenden Tabelle auswählt und mit dem rekursiven CTE verknüpft wird, der gerade aufgebaut wird

Dadurch haben Sie die Möglichkeit, rekursiv eine Ergebnismenge aufzubauen, aus der Sie dann auswählen können.

Wenn Sie sich den Northwind ansehen Beispiel-Datenbank hat sie eine Tabelle namens Employees die selbstreferenzierend ist:Employees.ReportsTo --> Employees.EmployeeID legt fest, wer wem unterstellt ist.

Ihr CTE würde in etwa so aussehen:

;WITH RecursiveCTE AS
(
    -- anchor query; get the CEO
    SELECT EmployeeID, FirstName, LastName, Title, 1 AS 'Level', ReportsTo
    FROM dbo.Employees
    WHERE ReportsTo IS NULL

    UNION ALL

    -- recursive part; select next Employees that have ReportsTo -> cte.EmployeeID      
    SELECT 
       e.EmployeeID, e.FirstName, e.LastName, e.Title, 
       cte.Level + 1 AS 'Level', e.ReportsTo
    FROM 
       dbo.Employees e
    INNER JOIN 
       RecursiveCTE cte ON e.ReportsTo = cte.EmployeeID
)
SELECT *
FROM RecursiveCTE
ORDER BY Level, LastName    

Ich weiß nicht, ob Sie Ihr Beispiel in einen richtigen rekursiven CTE übersetzen können - aber das ist im Grunde das Wesentliche:Ankerabfrage, UNION ALL, rekursive Abfrage