sql – 检索层次结构组…具有无限递归

前端之家收集整理的这篇文章主要介绍了sql – 检索层次结构组…具有无限递归前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个这样的表,其中包含链接: @H_403_2@key_a key_b -------------- a b b c g h a g c a f g

不是很整洁&无限递归……

key_a =父
key_b =孩子

需要一个查询,它将重新组合并为每个层次组(父项直接子项间接子项)赋予一个数字:

@H_403_2@key_a key_b nb_group -------------------------- a b 1 a g 1 b c 1 **c a** 1 f g 2 g h 2 **link responsible of infinite loop**

因为我们有

A-B-C-A

– >只想显示如图所示的链接.

任何的想法 ?

提前致谢

解决方法

问题是你并没有真正处理严格的层次结构;你正在处理有向图,其中一些图有周期.请注意,您的nbgroup#1没有任何规范的根 – 由于来自c-a的循环引用,它可能是a,b或c.

处理这个问题的基本方法是根据图形技术进行思考,而不是递归.实际上,迭代方法(不使用CTE)是我在sql中可以想到的唯一解决方案.基本方法explained here.

Here is a SQL Fiddle提供了解决周期和共享叶案例的解决方案.注意它使用迭代(具有故障保护以防止失控进程)和表变量来操作;我认为没有任何解决方法.另请注意更改的样本数据(a-g更改为a-h;下面介绍).

如果你深入研究sql,你会注意到我从链接中给出的解决方案中改变了一些关键的东西.该解决方案处理的是无向边缘,而边缘是有向的(如果使用了无向边缘,则整个样本集由于a-g连接而成为单个组件).

这就是为什么我在样本数据中将a-g更改为a-h的核心.如果只共享叶节点,那么您对问题的说明很简单;这是我编码的规范.在这种情况下,a-h和g-h都可以捆绑到它们的正确组件而没有问题,因为我们关心父母的可达性(即使给定周期).

但是,当您拥有共享分支时,您不清楚要显示内容.考虑a-g链接:鉴于此,g-h可以存在于任一组分(a-g-h或f-g-h)中.你把它放在第二个,但它可能在第一个,而不是?这种模糊性是我没有尝试在此解决方案中解决它的原因.

编辑:要清楚,在上面的解决方案中,如果遇到共享分支,它会将整个集合视为单个组件.不是你上面描述的,但在澄清问题后必须更改.希望这能让你接近.

猜你在找的MsSQL相关文章