Sql Oracle通过递归子级到父级查询进行连接,包括自引用的最终父级

Sql Oracle通过递归子级到父级查询进行连接,包括自引用的最终父级,sql,oracle,recursion,common-table-expression,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 我明白了 在我的数据库中,表中有数百万行,层次结构又深又广,我对所有的子项都不感兴趣。我可以推断出我感兴趣的孩子。因此,我想从头开始查询并提供子ID。然后,我希望递归地输出父级,直到到达顶部。在我的例子中,顶部是id和parent_id相等

在下面的示例中

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
我明白了

在我的数据库中,表中有数百万行,层次结构又深又广,我对所有的子项都不感兴趣。我可以推断出我感兴趣的孩子。因此,我想从头开始查询并提供子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

它没有输出A A。有可能这样做吗?我希望做的不是在输出中将父id显示为一个单独的列,而是显示与id相关的名称。然后,层次结构由顺序隐含。

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

希望有帮助。

太棒了。非常感谢你。显然,我对前面的表达式理解得不够透彻,但这将帮助我更好地理解它。@Ftaveras我冒昧地粘贴了整个正在工作的递归查询+那一个一个
select id, parent_id
from T
START WITH id = 'C'
CONNECT BY id = PRIOR parent_id and parent_id!= prior id;
--                                  ^^^^^^^^^^^^^^^^^^^^
--                                      break cycles