【问题标题】:Check if looped dependency exists in a hierarchy检查层次结构中是否存在循环依赖
【发布时间】:2016-08-01 17:37:55
【问题描述】:

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

数据:

【问题讨论】:

  • 您能否在问题中添加您正在使用的 RDBMS(SQLServer、Oracle、Postgres 等)以及您已经尝试过的 SQL?
  • 在 Postgres 中,您可以将“访问过”的项目聚合到一个数组中,并在递归 CTE 的连接条件下检查该数组
  • 我正在使用 MS SQL Server 2008 R2。你能提供我的查询吗?
  • @MarkBannister:MS SQL Server 2008 R2。请帮助如何在那里设计 SQL 查询。

标签: sql loops recursion hierarchy hierarchical-data


【解决方案1】:

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

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)

【讨论】:

    猜你喜欢
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-03
    • 2022-12-23
    • 1970-01-01
    • 2019-02-03
    相关资源
    最近更新 更多