6

循环引用的“乐趣”:

假设我有一个表 ELEMENTS,其中包含由父亲 ID 建模的元素层次结构。

根的父亲 ID 字段为空。

所有其他记录都有一个非空的父亲 ID,带有ID父亲元素的(自动排序的)主键 ( )。

例如,使用

SELECT *
FROM Elements
WHERE FATHER_ID not in (SELECT ID FROM Elements)

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

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

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

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

4

1 回答 1

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

您可能想阅读这篇文章:

于 2011-04-27T11:55:24.353 回答