sql >> Database teknologi >  >> RDS >> Sqlserver

Hvordan designes en SQL rekursiv forespørgsel?

Se:

Opdatering:

En ordentlig rekursiv CTE består grundlæggende af tre ting:

  • et anker SELECT til at starte med; der kan vælge f.eks. rodniveaumedarbejderne (hvor Reports_To er NULL), eller den kan vælge en hvilken som helst vilkårlig medarbejder, som du definerer, f.eks. med en parameter

  • en UNION ALL

  • en rekursiv SELECT sætning, der vælger fra den samme, typisk selvrefererende tabel og slutter sig til den rekursive CTE, der aktuelt bygges op

Dette giver dig mulighed for rekursivt at opbygge et resultatsæt, som du derefter kan vælge fra.

Hvis du ser på Northwind eksempeldatabase, den har en tabel kaldet Employees som er selvrefererende:Employees.ReportsTo --> Employees.EmployeeID definerer, hvem der rapporterer til hvem.

Din CTE ville se nogenlunde sådan ud:

;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    

Jeg ved ikke, om du kan oversætte din prøve til en ordentlig rekursiv CTE - men det er dybest set kernen i det:ankerforespørgsel, UNION ALL, rekursiv forespørgsel




  1. Hvad er SQLite

  2. Selvhenvisende fremmednøgle i sequlize js

  3. PHP/SQL:Brug kun én forespørgsel, VÆLG rækker fra to tabeller, hvis data er i begge tabeller, eller bare VÆLG fra én tabel, hvis ikke

  4. Oracle sqlldr tidsstempel format hovedpine