Oracle递归查询树结构

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle递归查询树结构相关的知识,希望对你有一定的参考价值。

之前在工作中碰到一个问题,需要找树结构下的所有子节点,如果用程序写会反复查询数据库,对性能有影响,在网上找了下,可以用Oracle的递归查询,例子如下:

create table test1 (
cid int,
cpid int
)
insert into test1 (cid,cpid) values(1,0);
insert into test1 (cid,cpid) values(2,1);
insert into test1 (cid,cpid) values(3,1);
insert into test1 (cid,cpid) values(4,2);
insert into test1 (cid,cpid) values(5,3);
insert into test1 (cid,cpid) values(6,3);

select * from test1
--找根的所有子
select * from test1 
start with cpid = 0
Connect by prior cid = cpid

--找 子所在的根节点
select * from test1 
start with cid = 3
Connect by prior cpid = cid

select * from(
select * from test1 
start with cid = 3
Connect by prior cpid = cid) where cid <> 3

另外,SQLServer查询树结构下的所有子节点可以用如下语句:

 WITH cteTree
        AS (SELECT *
              FROM test1 
              WHERE CId = @TreeId  --第一个查询作为递归的基点(锚点)
            UNION ALL
            SELECT test1.*     --第二个查询作为递归成员, 下属成员的结果为空时,此递归结束。
              FROM
                   cteTree INNER JOIN test1  ON cteTree.CId = test1 .PId) 
        SELECT *
          FROM cteTree 

太晚了,明天再完善SQLServer的

 

以上是关于Oracle递归查询树结构的主要内容,如果未能解决你的问题,请参考以下文章

Oracle start with connect by prior... 递归查询

ORACLE 递归树型结构统计汇总

使用Oracle数据库的递归查询语句生成菜单树

oracle的递归运算(树运算) 无限树形

SQL递归查询所有子节点

Oracle递归查询:使用prior实现树操作