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的

时间: 2024-10-13 00:28:22

Oracle递归查询树结构的相关文章

Oracle递归查询的原理

在Oracle 10g下,来到scott用户下,分别以层次 1,2,3,4上的节点做实验: 当start with是根节点(level=1),要查其子节点,connect by pump和emp都是被扫描4次(总的层次). 当start with是根节点(level=2),要查其子节点,connect by pump和emp被扫描3次. 当start with是根节点(level=3),要查其子节点,connect by pump和emp被扫描2次. 当start with是根节点(level=

oracle递归查询记录

1. start with  开始的id  connect by prior 开始的id=父id 2. level 级别 3.实例 select * from ( select a.*,level tt from biz_district a start with district_id=8 connect by prior district_id=parent_id ) where tt=3 select a.district_id, a.district_name, b.district_i

Oracle递归查询所有树结构,并确定其中的一条分支

递归查询所有树结构: select * from tableconnect by prior  id= parent_idstart with id=总公司的id 以上SQL语句查询出来的树结构有三条分支! 递归查询出的树结构,有多条分支的情况下,确定其中的某一条分支: SELECT *from(select * from tableconnect by prior id= parent_idstart with id=总公司的id) tconnect by prior id=parent_id

Oracle 递归查询

1 select a.accountcodeid, a.accountcode, a.accountcodename, 2 SYS_CONNECT_BY_PATH(a.accountcodename, '\') as fullname, a.parentcodeid, level 3 from fm_accountcode a 4 where a.accountcodeid >= 10000 5 start with a.parentcodeid is null 6 connect by pri

SqlServer CTE 递归查询 Oracle递归查询

在做数据库设计这块,很多时候表的数据模型就是典型的二叉树结构. 于是在查询数据的时候,就涉及到了数据的递归查询. 递归查询分为两种:1.从根节点查询自身以及所有的子节点:2.从子节点查询自身以及所有的父节点. 下面分别以Oracle 11g 数据库和MsSql 2008 数据库为例,来实现上述两种类型的递归查询 先建一张表 表名: TAdministrative  字段名称  说明  AdministrativeID  行政编号  AdministrativePID  当前行政级别的上一行政级别

ORACLE递归查询(适用于ID,PARENTID结构数据表)

Oracle 树操作(select…start with…connect by…prior) oracle树查询的最重要的就是select…start with…connect by…prior语法了.依托于该语法,我们可以将一个表形结构的以树的顺序列出来.在下面列述了oracle中树型查询的常用查询方式以及经常使用的与树查询相关的oracle特性函数等,在这里只涉及到一张表中的树查询方式而不涉及多表中的关联等. 1.准备测试表和测试数据 1 2 3 4 5 6 7 8 9 10 11 12 1

Oracle递归查询的几种方法

oracle的start with connect by prior是根据条件递归查询"树",分为四种使用情况: 第一种:start with 子节点ID='...' connect by prior 子节点ID = 父节点ID1select * from mdm_organization o start with o.org_code='10000008' connect by prior o.org_code=o.org_parent_code 按照条件org_code='1000

oracle递归查询子节点

通过子节点向根节点追朔. select * from persons.dept start with deptid=76 connect by prior paredeptid=deptid 通过根节点遍历子节点. select * from persons.dept start with paredeptid=0 connect by prior deptid=paredeptid 可通过level 关键字查询所在层次. select a.*,level from persons.dept a

oracle递归查询\sqlserver递归

使用 start with a= '起始ID' connect by prior a= b a为子项,b为父项. select F_CA_CODE,F_CA_PARENTCODE,LEVEL from RGT_UNIT start with F_CA_CODE = '0' connect by prior F_CA_CODE = F_CA_PARENTCODE 查询结果: 其中LEVEL为oracle内置函数 如果加入查询条件需要在start with前面加入: select F_CA_CODE