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

时间:2014-10-18 12:35:53

标签: sql oracle recursion common-table-expression

在以下示例中

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。然后我想以递归方式输出父级,直到我到达顶部。在我的例子中,top是id和parent_id相等的位置。这就是我正在尝试的,但我无法让它显示出顶级父母。

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

这给了我

C B
B A

它没有输出A A.是否可以这样做?我希望做的不是将parent_id显示为输出中的单独列,而只显示与id相关的名称。然后订单隐含层次结构。

1 个答案:

答案 0 :(得分:3)

我使用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

希望它有所帮助。