带有循环引用的“乐趣”:
假设我有一个表 ELEMENTS,其中包含元素的层次结构,由父 ID 建模。
对于根来说,父亲 ID 字段为空。
所有其他记录都有一个非空父 id 和(自动排序的)主键(ID
) 的父元素。
例如,使用
SELECT *
FROM Elements
WHERE FATHER_ID not in (SELECT ID FROM Elements)
我可以找到所有具有无效父引用的元素(FATHER_ID
不是外键,我们假设在本例中)。
但是,如何找到确实具有有效父引用但其父引用链不以根结尾的元素呢?我认为这只会发生在循环引用中,例如 A 是 B 的父亲,但 B 也是 A 的父亲。这样的“子树”不链接到根,因此不是主树的一部分。我想找到这样的子树。
当然,我正在寻找一个查询,它可以传递那些导致循环引用的元素,无论引用链有多长。
这在 SQL 中可能吗?还是我需要迭代解决方案?
SELECT n.*, CONNECT_BY_ROOT(id), level
FROM elements n
START WITH
id IN
(
SELECT MIN(id)
FROM (
SELECT id, CONNECT_BY_ROOT(id) AS root
FROM elements
START WITH
id IN
(
SELECT id
FROM elements n
WHERE CONNECT_BY_ISCYCLE = 1
CONNECT BY NOCYCLE
father_id = PRIOR id
)
CONNECT BY NOCYCLE
id = PRIOR father_id
)
GROUP BY
root
)
CONNECT BY NOCYCLE
id = PRIOR father_id
您可能想阅读这篇文章:
- 寻找树中的循环 http://explainextended.com/2009/05/18/finding-loops-in-a-tree/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)