SQL - 检测父子关系中的循环

时间:2010-07-12 16:14:58

标签: sql loops parent-child

我在excel中有父子数据,它被加载到运行MS SQL服务器的第三方系统中。数据代表有向(希望)非循环图。第三方意味着我没有完全自由的模式。 excel数据是其他文件的串联,并且存在这样的可能性:在各种文件之间的交叉引用中,某人已经引起循环 - 即,X是Y(X-> Y)的子,然后在其他地方(Y-> A-> BX)。我可以在excel或SQL server db上编写vb,vba等。 excel文件几乎是30k行,所以当数据设置增长时,我担心组合爆炸。因此,创建包含所有路径的表的一些技术可能非常难以处理。我正在考虑简单地编写一个程序,对于每个根,它会遍历每个叶子的树,如果深度大于某个标称值,则标记它。
 欢迎提出更好的建议或对前一次讨论的指示。

1 个答案:

答案 0 :(得分:4)

您可以使用递归CTE来检测循环:

with prev as (
    select RowId, 1 AS GenerationsRemoved
    from YourTable
    union all
    select RowId, prev.GenerationsRemoved + 1
    from prev
    inner join YourTable on prev.RowId = ParentRowId
    and prev.GenerationsRemoved < 55
)
select * 
from prev
where GenerationsRemoved > 50

这确实需要您指定最大递归级别:在这种情况下,CTE运行到55,并选择具有超过50个子级的错误行。

相关问题