SQL SELECT在父ID组织树中查找循环引用?

The*_*One 6 sql oracle cyclic-reference

带有循环引用的"Fun":

假设我有一个表ELEMENTS,它包含一个由父ID建模的元素层次结构.

对于root,父ID字段为空.

所有其他记录都具有ID父元素的(autosequenced)主键()的非null父id .

例如,使用

SELECT *
FROM Elements
WHERE FATHER_ID not in (SELECT ID FROM Elements)
Run Code Online (Sandbox Code Playgroud)

我可以找到所有具有无效父引用的元素(FATHER_ID不是外键,我们假设在这个例子中).

但是,我怎样才能找到具有有效父引用BUT的元素,其父引用链不会以根结尾?我认为这只能发生在循环引用上,例如A是B的父亲,但B也是A的父亲.这样的"子树"没有链接到根,因此不是主树的一部分.我想找到这样的子树.

当然,我正在寻找一个查询来提供那些导致循环引用的元素,无论引用链可能有多长.

这可能在SQL中,还是需要迭代解决方案?

Qua*_*noi 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
Run Code Online (Sandbox Code Playgroud)

您可能想阅读这篇文章: