sql >> Databasteknik >  >> RDS >> Sqlserver

Hur designar man en SQL-rekursiv fråga?

Se:

Uppdatering:

En riktig rekursiv CTE består i princip av tre saker:

  • ett ankare SELECT till att börja med; som kan välja t.ex. rotnivåanställda (där Reports_To är NULL), eller så kan den välja valfri godtycklig anställd som du definierar, t.ex. med en parameter

  • en UNION ALL

  • en rekursiv SELECT uttalande som väljer från samma, vanligtvis självrefererande tabell och ansluter till den rekursiva CTE som för närvarande byggs upp

Detta ger dig möjligheten att rekursivt bygga upp en resultatuppsättning som du sedan kan välja från.

Om du tittar på Northwind exempeldatabas, den har en tabell som heter Employees som är självrefererande:Employees.ReportsTo --> Employees.EmployeeID definierar vem som rapporterar till vem.

Din CTE skulle se ut ungefär så här:

;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    

Jag vet inte om du kan översätta ditt prov till en riktig rekursiv CTE - men det är i grunden kärnan i det:ankarfråga, UNION ALL, rekursiv fråga




  1. MySQL - Ryska tecken visas felaktigt

  2. SQL Server 2008 Full-Text Search (FTS) extremt långsam när mer än en CONTAINSTABLE i fråga

  3. Anpassade fält i Many2Many JoinTable

  4. Hur kan jag använda mysql i C++?