检查层次结构中是否存在循环依赖

Check if looped dependency exists in a hierarchy

我想检查 sql 中的 table 层次结构中是否存在循环。 (下面的示例。)它应该 return 是否正在形成任何循环。当我尝试递归 cte 时,它​​形成了一个无限循环。

数据:

下面将列出数据 table 中的所有子元素,以及它们的父层次结构,直到找到循环引用(或没有更多父元素的地方),以及一个指示器来显示是否在该 Child 的层次结构中发现循环引用:

with cte as
(select t.Child Original_Child, 
        t.Parent, 
        t.Child,
         '|' + convert(varchar(max),t.Parent) + '|' + convert(varchar(max),t.child) + '|' hierarchy_list, 
        convert(int,case Parent when Child then 1 else 0 end) circular_ind 
 from DataTable t
 union all
 select c.Original_Child, 
        t.Parent, 
        t.Child, 
        coalesce('|' + convert(varchar(max),t.Parent),'') + c.hierarchy_list hierarchy_list, 
        convert(int, 
                sign(charindex('|' + convert(varchar(max),t.parent) + '|',c.hierarchy_list)) 
                ) circular_ind
 from cte c
 join DataTable t on t.Child = c.Parent 
 where c.circular_ind=0),
cte_final as
(select c.*, 
        row_number() over (partition by original_child 
                           order by len(hierarchy_list) desc) rn from cte c)
select * from cte_final 
where rn=1
option (maxrecursion 0)