欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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升序排列

SQL-如何将具有上下级关系的数据表转化为树形图,清晰的看出各级人员的关系
从上图中,我们能看出每个人处于第几级,但是貌似还看不出某一个人的上下级是谁。。。。
在分层查询中,存在两个伪列,分别是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排序

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

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

相关标签: SQL 数据库 sql