sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cómo limitar la profundidad de recursión CTE pero seleccionar una tabla genérica?

Si todo lo que quiere hacer con su campo de nivel es limitar el número de recursiones, debería poder usar un MAXRECURSION sugerencia de consulta , algo como esto:

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)

Editar:

En respuesta a la pregunta en los comentarios, no, no puede suprimir el error que obtiene cuando recurre más veces de las que permite su configuración MAXRECURSION. Si te entiendo correctamente, podrías hacer algo como esto:

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;

Esto debería ser tan genérico como lo que tiene arriba, suponiendo que no planea cambiar los campos de clave principal o jerárquica.