Oracle中start with connect by prior 递归查询用法,查询多层下级员工。

一、问题出处:

之前在一个数据库群里,有人提出一个问题:现在有表user,user表中有字段username,leader,现在要查出来,leader是boss,boss的所有下属员工的username。但是boss的职位很高,他的下属可能还有下属,下属的下属还有下属,甚至还会有好多层下属。

二、伪大神的思路:

当时,我看到有人这样回答的就立刻吐血了,真的把程序员当码农,只会搬砖呀!!!

--没有眼界的结果:
select  username  from user
where leader = 'boss'
union 
select username from user 
where leader in(select  username  from user
where leader = 'boss';

如果有10层下属员工,难道还要写10个union all吗?子查询嵌套上9层吗?数据量一旦很大,数据库不得宕机呀。

领导立刻让卷铺盖走人。就是一个小小的查询下属员工,就把数据库搞崩了。

三、使用Oracle中的start with connect by prior

start with connect by prior是一种递归查询用法。

我们就以Oracle自带的数据库中雇员表emp为例:

--简单一行代码搞定:
select * from emp start with empno = 7839 connect by prior empno = mgr;

结果如下:

 这张结构就是emp雇员表层级图:四、讲讲start with connect by prior的用法:

1、connect by的语法:

select ... from tablename
start by cond1
connect by prior cond2
where cond3

2、各部分的介绍:

start with子句为可选项,用来标识哪个节点作为查找树型结构的根节点。若该子句被省略,则表示所有满足查询条件的行作为根节点。

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

prior运算符必须放置在连接关系的两列中某一个的前面。对于节点间的父子关系,prior运算符在一侧表示父节点,在另一侧表示子节点,从而确定查找树结构是的顺序是自顶向下还是自底向上。在连接关系中,除了可以使用列名外,还允许使用列表达式。

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

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

五、最后的用途:

start with connect by prior 递归查询用法:这个子句主要是用于B树结构类型的数据递归查询,给出B树结构类型中的任意一个结点,遍历其最终父结点或者子结点。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值