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;

结果如下:

Oracle中start with connect by prior 递归查询用法,查询多层下级员工。_第1张图片

 这张结构就是emp雇员表层级图:Oracle中start with connect by prior 递归查询用法,查询多层下级员工。_第2张图片四、讲讲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树结构类型中的任意一个结点,遍历其最终父结点或者子结点。

你可能感兴趣的:(oracle,oracle,数据库,database,connect,by,递归查询)