У меня есть таблица, которая содержит иерархию данных - что-то вроде:SQL Server CTE -Find top parentID для каждого дочернего ID?
childID | parentID
____________________
1 | 5
5 | 9
9 | 20
2 | 4
3 | 7
7 | 8
8 | 8
20 | 20
4 | 4
8 | 8
желаемого результата:
Я создал рекурсивные ОТВА, который находит мне верхнюю 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
)
Проблема:
Я выполнил КТР с явнымchildID
значение, чтобы начать с (214)! Так что это дает мне значение только для 214. CTE выполняет рекурсивную часть и находит topParent для childID.
но Я хочу ForEach row in the Table
- выполнить КТР со значением childID
!
Я пытался сделать это с CROSS APPLY
:
Что-то вроде:
select * from myTable Cross Apply (
;WITH cte AS (....)
)
но ИМХО (из моего тестирования !!) - его невозможно.
Другая идея размещения рекурсивного CTE в UDF имеет штраф за производительность (проблема udf, как мы знаем).
Как создать этот запрос, чтобы он действительно работал? (или некоторое близкое решение)?
вот что я пытался
https://data.stackexchange.com/stackoverflow/query/edit/69458
ive добавил экран печати для желаемого вывода. –
@RoyiNamir - Мой запрос на SE-Data возвращает то, что вы хотите. Я просто добавил столбцы «name» и «parentID». –
УБЕДИТЕСЬ, ЧТОБЫ ЗНАЧИТЬ, СЧИТАЮТ, ЧТО ВЫ НАЧИЛИСЬ С ВЕРХНЕГО - И НЕ ЛИСТЫ ... В чем же логика здесь (хотя и работает)? почему бы нам не начать с листьев по направлению к самым верхним листьям? –