У меня есть таблица, которая содержит данные иерархии - что-то вроде:
childID | parentID
____________________
1 | 5
5 | 9
9 | 20
2 | 4
3 | 7
7 | 8
8 | 8
20 | 20
4 | 4
8 | 8
желаемый результат:
Я создал рекурсивный CTE, который находит меня топ fatherID
.
Что-то вроде:
;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
)
Проблема:
Я выполнил CTE с явным childID
значением для начала (214)!
Поэтому он дает мне значение только для 214.
CTE выполняет рекурсивную часть и находит topParent для childID.
но
Я хочу ForEach row in the Table
- выполнить CTE со значением childID
!
Я попытался сделать это с помощью CROSS APPLY
:
Что-то вроде:
select * from myTable Cross Apply (
;WITH cte AS (....)
)
но IMHO (из моего тестирования!!) - его невозможно.
Другая идея поместить рекурсивный CTE в UDF имеет ограничение производительности (проблема udf, как мы знаем).
Как я могу создать этот запрос, чтобы он действительно работал? (или некоторое близкое решение)?
вот что я пробовал
https://data.stackexchange.com/stackoverflow/query/edit/69458