Учитывая следующую таблицу:
create table TreeNode
(
ID int not null primary key,
ParentID int null foreign key references TreeNode (ID)
)
Как мне написать обычное табличное выражение, чтобы оно начиналось с корня (WHERE ParentID IS NULL) и проходило по его потомкам до тех пор, пока набор результатов не будет содержать некоторый целевой узел (например, WHERE ID = n)? Легко начать с целевого узла и перейти вверх к корню, но это не приведет к тому же набору результатов. В частности, узлы, имеющие того же родителя, что и целевой узел, не будут включены.
Моя первая попытка была:
with Tree as
(
select
ID,
ParentID
from
TreeNode
where
ParentID is null
union all select
a.ID,
a.ParentID
from
TreeNode a
inner join Tree b
on b.ID = a.ParentID
where
not exists (select * from Tree where ID = @TargetID)
)
Что дает ошибку: Recursive member of a common table expression 'Tree' has multiple recursive references.
ПРИМЕЧАНИЕ. Меня интересует только обход сверху вниз.