Итак, я столкнулся с небольшой проблемой, по крайней мере, для меня.
Представьте, что я работаю с не так вымышленными данными иерархии, которые содержат ветви, области и т. Д. Я 'у нас есть некоторый код, который использует данные из хранимой процедуры, но недавно столкнулся с проблемой при появлении цикла.
Чтобы дать вам представление о том, как выглядят данные, используемые моей процедурой:
Branch 12K3 Parent 12K
Branch 12K2 Parent 12K
Branch 12K Parent REGION AA123
....
Моя работа заключается в создании новых узлов и назначении соответствующего родителя из вышеуказанных данных.Вроде как ниже.
CPX Node 1 Parent REGION AA456
CPX Node 2 Parent REGION SomeOtherRegion
CPX Node 3 Parent 12K2
CPX Node 4 Parent 12K
Обратите внимание, у меня есть два узла, у которых есть родители, которые оказываются ветвью.Это нежелательно.
Цель: Для любого узла CPX, чьим родителем является Branch, переходите вверх по иерархии, пока мы не найдем первый узел, который оказываетсяRegion.
Так что в этом случае мои узлы должны выглядеть следующим образом
CPX Node 1 Parent REGION AA456
CPX Node 2 Parent REGION SomeOtherRegion
CPX Node 3 Parent AA123 -- previously 12K2
CPX Node 4 Parent AA123 -- previously 12K
Я новичок во всей этой рекурсивной модели CTE в 2005 году, поэтому я наивно попробовал это:
;with cte as
(
-- initialization -- don't worry, this just checks for a cycle condition
select t1.SourceID, t1.SourceParentID
from @someTable t1
inner join @someTable t2
on t1.SourceID = t2.SourceParentID
and t2.SourceID = t1.SourceParentID
union all
-- recursive execution
select p.SourceID, gp.SourceParentID
from cte p
inner join entities as gp with (nolock)
on gp.SourceID = p.SourceParentID
)
select * from cte
Это сработало бы, но рекурсия никогда не заканчивается.Если бы кто-то с большим опытом, чем я, мог сказать мне, что я делаю неправильно, я был бы очень признателен!
Вывод моего SQL: