oracle的分层查询(递归查询)

1.分层查询语句:

  • start  with:指定层次的根部行,就是从哪里开始解析,对于真正的层次查询,(通俗解释:子句定义树查询的初始起点)这个子句是必需要有的。
  • connect  by prior:解释父子之间的关系(通俗解析:子句定义表中的数据是如何相互联系的)
  • prior:用于实现递归条件
  • level关键字:表示查询深度(level 表示递归的层次)

2.建表

建立dept表

CREATE TABLE "DHEE"."DEPT" ( 
  "DEPT_ID" VARCHAR2(20)
  , "PARENT_ID" VARCHAR2(20)
  , "DEPT_NAME" VARCHAR2(20)
)

插入数据

insert into DEPT values ('100','0','若依科技');
insert into DEPT values ('101','100','深圳总公司');
insert into DEPT values ('102','100','长沙分公司');
insert into DEPT values ('103','101','研发部门');
insert into DEPT values ('104','101','市场部门');
insert into DEPT values ('105','101','测试部门');
insert into DEPT values ('106','101','财务部门');
insert into DEPT values ('107','101','运维部门');
insert into DEPT values ('108','102','市场部门');
insert into DEPT values ('109','102','财务部门');

查询数据后显示

3.分层查询

select
  parent_id
  , dept_id
  , dept_name 
from
  dept 
start with
  parent_id = '0' 
connect by
  prior dept_id = parent_id

PARENT_ID    DEPT_ID    DEPT_NAME
 0       100    若依科技
100    101    深圳总公司
101    103    研发部门
101    104    市场部门
101    105    测试部门
101    106    财务部门
101    107    运维部门
100    102    长沙分公司
102    108    市场部门
102    109    财务部门

4.分层查询问题总结

遍历树的方向:
进一步说明CONNECT BY子句,它决定你是从顶向下还是从底向上进行遍历。CONNECT BY PRIOR col_1 = col_2。

如果是从顶向下遍历:
test_parent(col_1) 是父键(它标识父),test_child(col_2) 是子键(它标识子)

select
  parent_id
  , dept_id
  , dept_name 
from
  dept 
start with
  parent_id = '100' 
connect by
  prior dept_id = parent_id

PARENT_ID    DEPT_ID    DEPT_NAME
100    101    深圳总公司
101    103    研发部门
101    104    市场部门
101    105    测试部门
101    106    财务部门
101    107    运维部门
100    102    长沙分公司
102    108    市场部门
102    109    财务部门

如果是从底向上遍历:
test_parent(col_1)就是子键,test_child(col_2) 就是父键了。

select
  parent_id
  , dept_id
  , dept_name 
from
  dept 
start with
  parent_id = '100' 
connect by
  prior parent_id = dept_id

PARENT_ID    DEPT_ID    DEPT_NAME
100    101    深圳总公司
0    100        若依科技
100    102    长沙分公司
0    100        若依科技
 

d.递归(树)查询level关键字

level解释

level 和 connect by ,start with 合在一起,一般是用来实现递归(树)查询。
     connect by 子句定义表中的数据是如何相互联系的 
     start with 子句定义树查询的初始起点
     level 表示查询深度(level 表示递归的层次)

-- level 还可以用于图形化输出结果
--------lpad左填充用*
--------level表示查询深度(level表示递归的层次)

  select lpad(dept_id,length(dept_id) + level*10-10,'*') from dept 
       start with parent_id = '0' 
       connect by prior dept_id = parent_id;

LPAD(DEPT_ID,LENGTH(DEPT_ID)+LEVEL*10-10,'*')
100
**********101
********************103
********************104
********************105
********************106
********************107
**********102
********************108
********************109
 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值