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

Jak omezit hloubku rekurze CTE, ale vybrat obecnou tabulku?

Pokud vše, co chcete s polem úrovně udělat, je omezit počet rekurzí, měli byste mít možnost použít MAXRECURSION nápověda k dotazu , něco takového:

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)

Upravit:

V odpovědi na otázku v komentářích, ne, nemůžete potlačit chybu, která se objeví při opakování vícekrát, než umožňuje nastavení MAXRECURSION. Pokud vám dobře rozumím, můžete udělat něco takového:

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;

To by mělo být stejně obecné jako to, co máte výše, za předpokladu, že neplánujete změnit pole hierarchického nebo primárního klíče.




  1. Vypočítejte ujeté kilometry vozidel odečtením od hodnot vozidla

  2. Mohu v Mysql sloučit dvě databáze do jedné, pokud mají obě stejné schéma?

  3. Vylučovací řádek MySQL

  4. Jaký je rozdíl mezi funkcemi RANK() a DENSE_RANK() v oracle?