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

时间:2016-04-11 13:52:09

标签: sql loops recursion hierarchy hierarchical-data

我想检查sql中表中层次结构中是否存在任何循环。 (例如下面。)它应该返回是否有任何循环形成。当我尝试递归cte时,它形成了一个无限循环。

数据:

enter image description here

1 个答案:

答案 0 :(得分:0)

以下将列出数据表中的所有子元素,以及它们的父级层次结构,直到找到循环引用(或者没有更多父项),以及一个指示器,以显示是否在那个孩子的等级:

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)