Oracle中startwithconnectbyprior嵌套查询用法,查问多层下级职员。
原创1.问题来源:
以前,在数据库组中, 有人问了一个问题:现在有一张桌子了。user,user表中有多个字段username,leader,现在来找出答案,leader是boss,boss在所有下属员工中username。但是boss职位很高,他的下属也可能有下属,下属也有下属,甚至有很多层下属。
2、伪大神的思维:
当时看到有人这样回答,我马上就吐出血来。我真的把程序员变成了代码农民,只会搬砖头!
--没有远见的结果:
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自己的数据库中的Employee表。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是一个筛选所有返回记录的筛选器。
5.最后一次使用:
start with connect by prior 递归查询用法:此子句主要用于B给出了树型结构数据的递归查询B树结构类型中的任何节点都会遍历其最终的父节点或子节点。
版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除