sql >> Database >  >> RDS >> Sqlserver

Hoe ontwerp je een recursieve SQL-query?

Zie:

Bijwerken:

Een goede recursieve CTE bestaat in wezen uit drie dingen:

  • een anker SELECT beginnen met; die kan selecteren b.v. de medewerkers op rootniveau (waar de Reports_To is NULL), of het kan elke willekeurige werknemer selecteren die u definieert, b.v. door een parameter

  • een UNION ALL

  • een recursieve SELECT statement dat selecteert uit dezelfde, typisch zelfverwijzende tabel en aansluit bij de recursieve CTE die momenteel wordt opgebouwd

Dit geeft je de mogelijkheid om recursief een resultatenset op te bouwen waaruit je kunt kiezen.

Als je kijkt naar de Northwind voorbeelddatabase, het heeft een tabel met de naam Employees wat naar zichzelf verwijst:Employees.ReportsTo --> Employees.EmployeeID bepaalt wie aan wie rapporteert.

Uw CTE ziet er ongeveer zo uit:

;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    

Ik weet niet of u uw voorbeeld kunt vertalen naar een correcte recursieve CTE - maar dat is eigenlijk de essentie:ankerquery, UNION ALL, recursieve zoekopdracht




  1. Hoe de IN-operator te combineren met de LIKE-conditie (of de beste manier om vergelijkbare resultaten te krijgen)

  2. Dubbele invoer '0' voor sleutel 'PRIMARY'

  3. MySQL &MSSQL gebruiken voor twee verschillende databases met Entity Framework

  4. Haal laatste rij PER Groep