关于start with 和connect by

select * from  bd_department  得到如下的结果

DPID       DPNAME               DPPID     
---------- -------------------- ----------
01         一级部门1                       
02         一级部门2                       
03         一级部门3                       
0101       二级部门1             01        
0102       二级部门1             01        
0103       二级部门1             01        
010201     3级部门1             0102      
0301       2级部门31            03        
0302       2级部门32            03        
030201     2级部门3101          0302      

10 rows selected 

然后用

select dpid,dppid, lpad(' ',6*(level-1))||dpname from bd_department connect by dppid= prior dpid

得到的结果如下:

01  一级部门1
0101 01 二级部门1
0101 01       二级部门1
0102 01 二级部门1
0102 01       二级部门1
010201 0102       3级部门1
010201 0102 3级部门1
010201 0102             3级部门1
0103 01 二级部门1
0103 01       二级部门1
02  一级部门2
03  一级部门3
0301 03 2级部门31
0301 03       2级部门31
0302 03 2级部门32
0302 03       2级部门32
030201 0302       2级部门3101
030201 0302             2级部门3101
030201 0302 2级部门3101

得到了很多的重复记录,原因是在扫描的过程中,不仅有首级部门,任何一条记录都有一个开始,加上每个部门的下级部门的记录,总计有19条,

然后使用:

select dpid,dppid, lpad(' ',6*(level-1))||dpname from bd_department start with dppid is null  connect by dppid= prior dpid  得到了全部正确的结果.

另外得要说明的是connect by中的 条件不能设置在根节点,而只能是根节点以下的节点

select dpid,dppid, lpad(' ',6*(level-1))||dpname from bd_department start with dppid is null  connect by dppid= prior dpid and dpid!='03' 得到的还是全部的结果

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值