带有循环引用的“Fun”:
假设我有一个表ELEMENTS,它包含一个元素层次结构,由父ID建模。
root的父ID字段为空。
所有其他记录都具有父元素的(autosequenced)主键(ID
)的非null父id。
例如,使用
SELECT *
FROM Elements
WHERE FATHER_ID not in (SELECT ID FROM Elements)
我可以找到所有具有无效父引用的元素(FATHER_ID
不是外键,让我们假设在这个例子中)。
但是,如何才能找到具有有效父引用BUT的元素,其父引用链不会在根目录中结束?我认为这只能发生在循环引用中,例如A是B的父亲,但B也是A的父亲。这样的“子树”没有链接到根,因此不是主树的一部分。 我想找到这样的子树。
当然,我正在寻找一个查询,无论引用链有多长,它都会提供导致循环引用的元素。
这可能在SQL中,还是需要迭代解决方案?
答案 0 :(得分:5)
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
您可能想阅读这篇文章: