小编典典

Oracle CONNECT BY递归子级到父级查询,包括自我引用的最终父级

sql

在下面的例子中

id parent_id
A  A
B  A
C  B

select id, parent_id
from table
start with id = 'A'
connect by nocycle parent_id = prior id

我懂了

A A
B A
C B

在我的数据库中,表中有数百万行,而且层次结构又深又宽,我对所有子级都不感兴趣。我可以派生出我感兴趣的孩子。因此,我想打开查询并向START
WITH提供孩子ID。然后,我想递归输出父级,直到到达顶部。在我的情况下,顶部是id和parent_id相等的地方。这是我正在尝试的方法,但无法显示顶级父级。

select id, parent_id
from table
START WITH id = 'C'
CONNECT BY nocycle id = PRIOR parent_id

这给了我

C B
B A

它没有输出AA。可以这样做吗?我希望不会在输出中将parent_id显示为单独的列,而只是显示与该ID相关的名称。然后,该顺序隐含了层次结构。


阅读 238

收藏
2021-04-28

共1个答案

小编典典

我通过使用WITH子句得到了那个结果。

WITH REC_TABLE ( ID, PARENT_ID)
AS
(
    --Start WITH 
    SELECT ID, PARENT_ID
    FROM table
    WHERE ID='C'

    UNION ALL
    --Recursive Block
    SELECT T.ID, T.PARENT_ID
    FROM table T 
    JOIN REC_TABLE R
    ON R.PARENT_ID=T.ID
    AND R.PARENT_ID!=R.ID   --NoCycle rule
)
SELECT *
FROM REC_TABLE;

它似乎也可以这样工作。

select id, parent_id
from T
START WITH id = 'C'
CONNECT BY id = PRIOR parent_id and parent_id!= prior id;
--                                  ^^^^^^^^^^^^^^^^^^^^
--                                      break cycles

希望能帮助到你。

2021-04-28