我想检查sql中表中层次结构中是否存在任何循环。 (例如下面。)它应该返回是否有任何循环形成。当我尝试递归cte时,它形成了一个无限循环。
数据:
答案 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)