小编典典

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

sql

我在excel中有父子数据,该数据已加载到运行MS SQL
Server的第3方系统中。数据表示有向(希望)非循环图。第三方意味着我在架构中没有完全自由的手。excel数据是其他文件的串联,并且存在以下可能性:在各个文件之间的交叉引用中,有人引起了循环-
即X是Y的子级(X-> Y),然后是其他地方(Y-> A- > BX)。我可以在Excel或SQL
Server数据库上编写vb,vba等。excel文件几乎是3万行,因此随着数据的增长,我担心组合爆炸。因此,诸如创建具有所有路径的表之类的一些技术可能非常笨拙。我正在考虑简单地编写一个程序,该程序针对每个根目录,
欢迎提供更好的建议或指向之前的讨论的指针。


阅读 195

收藏
2021-04-07

共1个答案

小编典典

您可以使用递归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个的错误行。

2021-04-07