Tengo una tabla que contiene los datos de jerarquía - algo así como:SQL Server CTE: ¿encuentra top parentID forEach childID?
childID | parentID
____________________
1 | 5
5 | 9
9 | 20
2 | 4
3 | 7
7 | 8
8 | 8
20 | 20
4 | 4
8 | 8
salida deseada:
He creado un CTE recursiva, que me encuentra el fatherID
superior.
Algo así como:
;WITH cte AS (
SELECT a.childID
,a.parentID
,1 AS lvl
FROM [Agent_Agents] a
WHERE a.childID = 214 //<==== value to begin with !! - thats part the problem
UNION ALL
SELECT tmp.childID
,tmp.parentID
,cte.lvl+1
FROM [Agent_Agents] tmp
INNER JOIN cte ON tmp.childID = cte.parentID
WHERE cte.childID<>cte.parentID
)
SELECT *
FROM cte
WHERE lvl = (
SELECT MAX(lvl)
FROM cte
)
El problema:
que ejecuta el CTE con explícita valorchildID
, para empezar (214)! Me da el valor solo para 214. CTE realiza la parte recursiva y encuentra topParent para childID.
pero Quiero ForEach row in the Table
- para ejecutar el CTE con el valor childID
!
he tratado de hacerlo con CROSS APPLY
:
Algo así como:
select * from myTable Cross Apply (
;WITH cte AS (....)
)
pero en mi humilde opinión (de mi prueba !!) - es imposible.
La otra idea de poner el CTE recursivo en un UDF tiene una penalización de rendimiento (el problema de udf como lo conocemos).
¿Cómo puedo crear esta consulta para que realmente funcione? (o alguna solución cercana)?
aquí es lo que he tratado
https://data.stackexchange.com/stackoverflow/query/edit/69458
ive agregó una pantalla de impresión para la salida deseada. –
@RoyiNamir - Mi consulta sobre SE-Data devuelve lo que desea. Acabo de agregar las columnas 'name' y' parentID'. –
Me alegra saber por qué decidiste comenzar por el más alto, y no por las hojas ... ¿cuál es la lógica aquí (aunque funciona)? ¿Por qué no podríamos comenzar con las hojas hacia las hojas superiores? –