Ho una tabella che contiene i dati di gerarchia - qualcosa come:SQL Server CTE -Trova genitore superiore perOid childID?
childID | parentID
____________________
1 | 5
5 | 9
9 | 20
2 | 4
3 | 7
7 | 8
8 | 8
20 | 20
4 | 4
8 | 8
output desiderato:
Ho creato un CTE ricorsiva, che mi trova in cima fatherID
.
Qualcosa di simile:
;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
)
Il problema:
ho eseguito il CTE con esplicito valorechildID
per cominciare (214)! Quindi mi dà solo il valore per 214. il CTE fa la parte ricorsiva e trova topParent per childID.
ma voglio ForEach row in the Table
- per eseguire il CTE con il valore childID
!
ho cercato di farlo con CROSS APPLY
:
Qualcosa di simile:
select * from myTable Cross Apply (
;WITH cte AS (....)
)
ma IMHO (dal mio test !!) - è impossibile.
L'altra idea di mettere il CTE ricorsivo in un UDF ha una penalizzazione delle prestazioni (problema di udf come sappiamo).
Come posso creare questa query in modo che funzioni effettivamente? (o qualche soluzione vicina)?
qui è quello che ho provato
https://data.stackexchange.com/stackoverflow/query/edit/69458
Ive ha aggiunto una schermata di stampa per l'output desiderato. –
@RoyiNamir - La mia query su SE-Data restituisce ciò che desideri. Ho appena aggiunto le colonne 'name' e' parentID'. –
Sarò GLAD a sentire perché hai deciso di iniziare con il più alto - e non le foglie .... qual è la logica qui (anche se funziona)? perché non potremmo iniziare con le foglie verso le foglie più alte? –