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

标签 sql loops parent-child

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

最佳答案

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

关于SQL - 检测父子关系中的循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3230146/

相关文章:

sql - 确保数据只能由其在数据库中的实际所有者更改

java - 在java中使用数组/循环设置变量的值

javascript - 单击子 div 时不会调用父 onclick() 事件

jquery - 如何使用 jQuery 禁用主体滚动,但不禁用子元素?

python - PyQt - 小部件的父级 - 有必要吗?

sql - 在 SQL Server 中,将 int 类型的列更改为 text

sql - 查询以获取一天中每个小时的结果,甚至数据(如果不存在)

sql - 如何在 Liquibase 中对数据库架构的基线进行版本控制

javascript - 如何补偿仍在进行中的数组迭代中已删除的元素?

python - 在 Python 中 n 次失败后退出无限循环的最佳方法是什么?