SQL-如何将具有上下级关系的数据表转化为树形图,清晰的看出各级人员的关系
程序员文章站
2022-04-05 17:11:57
...
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升序排列
从上图中,我们能看出每个人处于第几级,但是貌似还看不出某一个人的上下级是谁。。。。
在分层查询中,存在两个伪列,分别是level
和connect_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排序
通过分层查询,可以清晰的找出各级人员及其上下级关系。
上一篇: 在SQLBolt网站上学习入门SQL
下一篇: 文科生的SQL初体验之模糊查询