sql - 检索分层组...无限递归

标签 sql sql-server-2008

我有一个这样的表,其中包含链接:

key_a    key_b
--------------
a        b        
b        c
g        h     
a        g       
c        a
f        g

不是很整洁和无限递归......

key_a = 父级
key_b = child

需要一个查询,该查询将为每个分层组(父级+直接子级+间接子级)重新组合和分配一个数字:
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 都可以毫无问题地捆绑到它们适当的组件上,因为我们担心 parent 的可达性(即使是给定的周期)。

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

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

关于sql - 检索分层组...无限递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17948457/

相关文章:

sql - 如何从另一个表中按日期选择最新项目

sql-server-2008 - 如何部署SQL Server Compact Edition 4.0?

MySQL 问题 - 使用 'string_value' 查询数据库属性对某些属性返回 0 而对其他属性返回所有行,为什么?

mysql - x <> ANY 的定义

sql - 使用sql计算类型时间的总和

SQL - 按顺序查找下一个行 ID

php - Sql 连接两个表并获取值

sql - 将 XML 存储在 XML 类型字段中或使用 FILESTREAM

asp.net - 如何在 SQL Server 表中创建图像列并使用 VB 在 ASP.NET 中检索它

sql-server - SQL Server 2008 外键冲突