sql >> Databáze >  >> RDS >> Sqlserver

Jak navrhnout rekurzivní dotaz SQL?

Viz:

Aktualizace:

Správné rekurzivní CTE se skládá v podstatě ze tří věcí:

  • kotva SELECT začít s; která může vybrat např. zaměstnanci na kořenové úrovni (kde Reports_To je NULL), nebo může vybrat libovolného zaměstnance, kterého definujete, např. parametrem

  • a UNION ALL

  • rekurzivní SELECT příkaz, který vybírá ze stejné, obvykle samoodkazující tabulky a spojuje se s rekurzivním CTE, který se právě vytváří

To vám dává možnost rekurzivně vytvořit sadu výsledků, ze které pak můžete vybírat.

Pokud se podíváte na Northwind ukázková databáze, obsahuje tabulku nazvanou Employees který odkazuje na sebe:Employees.ReportsTo --> Employees.EmployeeID definuje, kdo se komu hlásí.

Vaše CTE by vypadalo nějak takto:

;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    

Nevím, jestli dokážete přeložit svůj vzorek do správného rekurzivního CTE – ale to je v podstatě podstata:kotevní dotaz, UNION ALL, rekurzivní dotaz




  1. Oracle - Audit Trail pro konkrétního uživatele

  2. Jak nainstalovat Oracle SQL Developer 18.2 na Windows 10?

  3. načítání enwiki-latest-categorylinks.sql do mysql

  4. Potřebují tabulky MySQL ID?