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中,还是需要迭代解决方案?
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)
您可能想阅读这篇文章:
| 归档时间: |
|
| 查看次数: |
4837 次 |
| 最近记录: |