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