sql >> Databasteknik >  >> RDS >> Sqlserver

Hur begränsar man CTE-rekursionsdjupet men väljer generisk tabell?

Om allt du vill göra med ditt nivåfält är att begränsa antalet rekursioner, bör du kunna använda en MAXRECURSION frågetips , ungefär så här:

WITH Department_CTE AS
(
    SELECT
        DepartmentGroupKey,
        ParentDepartmentGroupKey,
        DepartmentGroupName
    FROM dimDepartmentGroup
    WHERE DepartmentGroupKey = 2
    UNION ALL
    SELECT
        Child.DepartmentGroupKey,
        Child.ParentDepartmentGroupKey,
        Child.DepartmentGroupName
    FROM Department_CTE AS Parent
        JOIN DimDepartmentGroup AS Child
            ON Parent.ParentDepartmentGroupKey = Child.DepartmentGroupKey
)
SELECT * FROM Department_CTE
OPTION (MAXRECURSION 2)

Redigera:

Som svar på frågan i kommentarerna, nej, du kan inte undertrycka felet som du får när du upprepar fler gånger än din MAXRECURSION-inställning tillåter. Om jag förstår dig rätt kan du göra något så här:

WITH CTE AS
(
    -- Start CTE off by selecting the task that was provided to stored procedure.
    SELECT Id, 0 as [Level]
    FROM [dbo].[TestTable]
    WHERE [Id] = 1
    -- Recursively add tasks that are children of parent tasks that have already been found in previous iterations.
    UNION ALL
    SELECT t.Id, [Level] + 1
    FROM [dbo].[TestTable] as t
    INNER JOIN CTE as tcte
        ON t.[ParentId] = tcte.[Id]
    WHERE [Level] < 2
),
CTE2 AS
(
    SELECT TestTable.*
    FROM CTE
        INNER JOIN TestTable ON CTE.Id = TestTable.Id
)
SELECT * FROM CTE2;

Detta bör vara lika generiskt som det du har ovan, förutsatt att du inte planerar att ändra de hierarkiska eller primära nyckelfälten.




  1. Det går inte att ändra transaktionens skrivskyddade egenskap mitt i en transaktion

  2. ta bort objekt från databasen efter 30 minuter

  3. Mysql:Är det praktiskt att skapa en separat tabell för varje användares inlägg

  4. Postgresql:Beräkna rang efter antal sanna ELLER-satser