Oracle中startwithconnectbyprior嵌套查询用法,查问多层下级职员。

原创
小哥 3年前 (2022-10-29) 阅读数 48 #大杂烩

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树结构类型中的任何节点都会遍历其最终的父节点或子节点。

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除

热门