SQL-如何将具有上下级关系的数据表转化为树形图,清晰的看出各级人员的关系

1、需求:对于scott用户的emp表,以KING为一级人员,找出所有人员的等级关系。并能清晰的找出每个人的上下级。

2、分析及解答

在上一篇博客中讲到,使用分层查询可以很好的找到每个人员所在层级,代码及结果如下:

select
level,
empno,
ename,
sal,
hiredate,
mgr,
(prior ename) as mgr_name,  --返回ename上一级的信息
(prior sal) mgr_sal   --返回sal上一级的信息
from emp 
start with mgr is null  --以哪一行为根节点
connect by (prior empno)=mgr   --分层条件,定义上下级关系
order by level;   --以level升序排列

在这里插入图片描述
从上图中,我们能看出每个人处于第几级,但是貌似还看不出某一个人的上下级是谁。。。。
在分层查询中,存在两个伪列,分别是levelconnect_by_isleaf
若以每一行作为一个节点,而以KING作为根节点, 那么:

  • level:表示每一行(节点)在第几层。
  • connect_by_isleaf:表示对于当前节点而言,有没有子节点。【1无0有】

在分层查询中,存在着独有的排序方式,即order siblings by col_name,故具有清晰上下级关系的查询及查询结果如下:

select
level,
(lpad(' ',(level-1)*2,' ')||empno)  树形图,   --根据层级左填充空格,以展示树形
empno,
ename,
connect_by_isleaf 是否有,    --1无0有
(case connect_by_isleaf when 1 then '没有子树'
else '有子树' end) 是否有子树,
sal,
hiredate,
mgr,
(prior ename) as mgr_name,
(prior sal) mgr_sal
from emp 
start with mgr is null
connect by (prior empno)=mgr
order siblings by empno;    --在转换成树形图之后,根据树形关系排序
--order by empno     --根据查询结果的empno排序

在这里插入图片描述

通过分层查询,可以清晰的找出各级人员及其上下级关系。

猜你喜欢

转载自blog.csdn.net/weixin_36522099/article/details/105306109
今日推荐