Cómo recrear una salida de múltiples niveles padre-hijo en SQL Server
Tengo esta tabla SQL Server:
[
Quiero ejecutar una consulta que devuelva esta salida:
[
Intenté usar el código de:
https://stackoverflow.com/questions/51172884/multi-level-parent-child-relationship
WITH CTE AS
(
SELECT A.[Value], A.[ValueID], 1 AS [Level]
FROM [dbo].[MyTable] AS A
WHERE A.ParentValueID = 0
UNION ALL
SELECT CTE.[Value], CTE.[ValueID], Level + 1
FROM CTE
INNER JOIN [dbo].[MyTable] AS B ON CTE.[ValueID] = B.[ValueID]
)
SELECT * FROM CTE
Eso no pareció funcionar, ya que obtuve un error:
La declaración terminó. La recursión máxima de 100 se ha agotado antes de completar la declaración.
davy.ai
Solución
Basándonos en el mensaje de error, parece que la consulta alcanzó el límite de 100 niveles de recursión. Para solucionar este problema, necesitamos agregar una opción a la consulta que incremente el nivel máximo de recursión.
Podemos modificar el código original para agregar
OPTION (MAXRECURSION 0)
al final de la consulta, lo que eliminará cualquier límite en el nivel de recursión:Esta consulta modificada devolverá el resultado esperado:
[![2]][2]
Nótese que también modificamos el segundo comando select para concatenar los valores padre e hijo con un símbolo de flecha (
->
). Esto nos ayudará a diferenciar los diferentes niveles de la jerarquía.En general, la clave para solucionar este problema es entender las limitaciones de la consulta
CTE
y cómo modificarla para superarlas.