【问题标题】:Oracle CONNECT BY recursive child to parent query, include ultimate parent that self referencesOracle CONNECT BY 递归子级到父级查询,包括自引用的最终父级
【发布时间】:2014-12-13 21:49:02
【问题描述】:

在下面的例子中

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

在我的数据库中,我的表中有数百万行,层次结构又深又广,我对所有孩子都不感兴趣。我可以派生出我感兴趣的孩子。所以我想把查询放在它的头上,并提供带有孩子 ID 的 START WITH。然后我想递归地输出父级,直到我到达顶部。在我的情况下,顶部是 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 相关的名称。然后,层次结构由顺序隐含。

【问题讨论】:

    标签: sql oracle recursion common-table-expression


    【解决方案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
    

    希望对你有帮助。

    【讨论】:

    • 太棒了。非常感谢。显然我对 PRIOR 表达式的理解不够好,但这将有助于我更好地理解它。
    • @Ftaveras 我冒昧地粘贴了整个工作递归查询。为那个+1
    猜你喜欢
    • 2013-09-15
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    • 2013-01-31
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多