Найти первого родителя, который удовлетворяет условию SQL Server - PullRequest
2 голосов
/ 21 ноября 2011

Итак, я столкнулся с небольшой проблемой, по крайней мере, для меня.

Представьте, что я работаю с не так вымышленными данными иерархии, которые содержат ветви, области и т. Д. Я 'у нас есть некоторый код, который использует данные из хранимой процедуры, но недавно столкнулся с проблемой при появлении цикла.

Чтобы дать вам представление о том, как выглядят данные, используемые моей процедурой:

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:

IMG1

...