ORACLE 树形遍历查询根节点、父节点、子节点

1、准备演示数据

创建表结构:

-- Create table

createtable Z_ORG(  cid         NUMBER,  cname       VARCHAR2(32),  parent_id   NUMBER,  create_time DATE,  org_level   NUMBER)

tablespace POWERDESK

  pctfree10

  initrans1

  maxtrans255;

-- Add comments to the table

commentontable Z_ORG  is'机构组织简化表';

-- Add comments to the columns

commentoncolumn Z_ORG.cid  is'主键ID';

commentoncolumn Z_ORG.cname  is'组织名称';

commentoncolumn Z_ORG.parent_id  is'上级组织ID';

commentoncolumn Z_ORG.create_time  is'创建时间';

commentoncolumn Z_ORG.org_level  is'组织级别';

 

 

录入数据:

  insertinto z_org(cid,cname,parent_id,create_time,org_level) select1,'地球',0,sysdate,1from dual;

  insertinto z_org(cid,cname,parent_id,create_time,org_level) select2,'中国',1,sysdate,2from dual;

  insertinto z_org(cid,cname,parent_id,create_time,org_level) select3,'上海直辖市',2,sysdate,3from dual;

  insertinto z_org(cid,cname,parent_id,create_time,org_level) select4,'江苏省',2,sysdate,3from dual;

  insertinto z_org(cid,cname,parent_id,create_time,org_level) select5,'南京市',4,sysdate,4from dual;

  insertinto z_org(cid,cname,parent_id,create_time,org_level) select6,'苏州市',4,sysdate,4from dual;

  insertinto z_org(cid,cname,parent_id,create_time,org_level) select7,'无锡市',4,sysdate,4from dual;

  insertinto z_org(cid,cname,parent_id,create_time,org_level) select8,'虹口区',3,sysdate,4from dual;

  insertinto z_org(cid,cname,parent_id,create_time,org_level) select9,'浙江省',2,sysdate,3from dual;

  insertinto z_org(cid,cname,parent_id,create_time,org_level) select10,'杭州市',9,sysdate,4from dual;

  insertinto z_org(cid,cname,parent_id,create_time,org_level) select11,'宁波市',9,sysdate,4from dual;

  insertinto z_org(cid,cname,parent_id,create_time,org_level) select12,'美国',1,sysdate,2from dual;

  insertinto z_org(cid,cname,parent_id,create_time,org_level) select13,'加利福尼亚州',12,sysdate,3from dual;

  insertinto z_org(cid,cname,parent_id,create_time,org_level) select14,'旧金山市',13,sysdate,4from dual;

  insertinto z_org(cid,cname,parent_id,create_time,org_level) select15,'撒门市',13,sysdate,4from dual;

commit;

 

 

 

 

2、遍历根节点

1.  select  code1 from tablename  

2.  start with code2  

3.  connect by code3  

4.  where cond3 

code2是根结点的限定语句,当然可以放宽限定条件,以取得多个根结点,实际就是多棵树。

code3是连接条件,其中用prior表示上一条记录,比如connect by prior id=parentid就是说上一条记录的id是本条记录的parent,即本记录的父亲是上一条记录。

 

code4是过滤条件,用于对返回的所有记录进行过滤。


prior和start with关键字是可选项:

prior运算符必须放置在连接关系的两列中某一个的前面。对于节点间的父子关系,prior运算符在一侧表示父节点,在另一侧表示子节点,从而确定查找树结构是的顺序是自顶向下还是自底向上。在连接关系中,除了可以使用列名外,还允许使用列表达式。start with子句为可选项,用来标识哪个节点作为查找树型结构的根节点。若该子句被省略,则表示所有满足查询条件的行作为根节点。

 

遍历表,求得某一个节点的所有上级节点记录,比如求得撒门市的上级组织,应该获得加利福尼亚州,美国,地球这些记录,如下所示:

SQL>     select t.cid, t.cname, t.parent_id,level

  2      from z_org t

  3      startwith t.cname='撒门市'

  4      connectbynocycleprior t.parent_id=t.cid

  5      orderbylevelasc

  6  ;

       CID CNAME                             PARENT_ID      LEVEL

---------- -------------------------------- ---------- ----------

        15撒门市                                   13          1

        13加利福尼亚州                             12          2

        12美国                                      1          3

         1地球                                      0          4

 

SQL>

 

 

遍历求得根路径字符串:

SQL>   select cname_child, wm_concat(t2.cname)

  2    from(

  3      select'苏州市' cname_child, t.cid, t.cname, t.parent_id,level

  4      from z_org t

  5      startwith t.cname in('苏州市')

  6      connectbynocycleprior t.parent_id=t.cid

  7    )t2 groupby cname_child ;

CNAME_CHILD WM_CONCAT(T2.CNAME)

----------- --------------------------------------------------------------------------------

苏州市      苏州市,地球,中国,江苏省

 

SQL>

 

 

 

 

3、遍历子节点

5.  select  code1 from tablename  

6.  start with code2  

7.  connect by code3  

8.  where cond3 

code2是根结点的限定语句,当然可以放宽限定条件,以取得多个根结点,实际就是多棵树。

code3是连接条件,其中用prior表示上一条记录,比如connect by prior id=parentid就是说上一条记录的id是本条记录的parent,即本记录的父亲是上一条记录。

 

code4是过滤条件,用于对返回的所有记录进行过滤。


prior和start with关键字是可选项:

prior运算符必须放置在连接关系的两列中某一个的前面。对于节点间的父子关系,prior运算符在一侧表示父节点,在另一侧表示子节点,从而确定查找树结构是的顺序是自顶向下还是自底向上。在连接关系中,除了可以使用列名外,还允许使用列表达式。
start with子句为可选项,用来标识哪个节点作为查找树型结构的根节点。若该子句被省略,则表示所有满足查询条件的行作为根节点。

 

如下所示,prior偏向父节点,就往下查询,查询节点下面所有的子节点记录:

select t1.parent_id, t1.cid, casewhenlevel=1then'*'||t1.cname whenlevel=2then'*-----'||t1.cname whenlevel=3then'*-----*-----'||t1.cname else t1.cname end , level

from z_org t1

startwith t1.parent_id = 1

connectby  t1.cid=prior t1.parent_id

;

 

 

如下所示E:\u\oracle\problem\pic\52.png:

 

 

如下所示,prior偏向子节点,就往下查询,查询节点下面所有的子节点记录:

select t1.parent_id, t1.cid, casewhenlevel=1then'*'||t1.cname whenlevel=2then'*-----'||t1.cname whenlevel=3then'*-----*-----'||t1.cname else t1.cname end , level

from z_org t1

startwith t1.parent_id = 1

connectbyprior t1.cid=t1.parent_id

;

 

执行结果如下所示E:\u\oracle\problem\pic\51.png:

 

 

 

 

 

 

4、扩展研究

 

---从parentid到cid开始递归,并以parentid为主展示这条记录
select t1.parentid, t1.cid, level
from test_category t1
start with t1.parentid = 1
connect by prior t1.parentid = t1.cid
;
---从parentid到cid开始递归,并以parentid为主展示这条记录
select t1.parentid, t1.cid, level
from test_category t1
start with t1.cid = 1
connect by prior t1.parentid = t1.cid
;

---从parentid到cid开始递归,并以cid为主展示这条记录
select t1.cid, t1.parentid, level
from test_category t1
start with t1.parentid = 1
connect by t1.parentid = prior t1.cid
;
---从parentid到cid开始递归,并以cid为主展示这条记录
select t1.cid, t1.parentid, level
from test_category t1
start with t1.cid = 1
connect by t1.parentid = prior t1.cid
;

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值