我在 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/