列出管理结构树
Employees2.txt 是某企业员工表,记录了每位员工的 ID 和名字:
Relationships.txt 记录了员工之间的从属关系,例如第一条记录就代表编号为 7902 的员工其经理是编号为 7566 的员工,第 14 条记录代表员工 7839 没有经理,他是最上层的经理。
请返回一个结果集,描述整个表的层次关系,它的结构要求如下:
King
King-Blake
King-Blake-Allen
…
King-Clark
King-Clark-Miller
…
首先找出某一员工 A,通过关系表找到该员工对应的上级 B,再查找 B 的上级 C,找到之后在进行循环。直至该上级已经是最高的领导者,跳出内层循环,对下一个员工的上级进行循环查找。
最后把结果排序,即可得到题目要求的结果。
A |
B |
C |
D |
|
1 |
=T("Employees2.txt").keys(EMPNO) |
=T("Relationships.txt").keys(EMPNO) |
[] |
|
2 |
for A1 |
=A2.EMPNO |
=A2.ENAME |
|
3 |
for |
=B1.find(B2).MGR |
||
4 |
if C3==null |
break |
||
5 |
=A1.find(C3).ENAME |
>C2=C5/"-"/C2 |
||
6 |
>B2=C3 |
next |
||
7 |
>C1|=C2 |
|||
8 |
=C1.sort() |
http://try.scudata.com.cn/try.jsp?splx=ExB003lcgljgs1.splx
A1读出员工数据并指定EMPNO为主键,A2读出从属关系表,同样设置了主键。C1准备了空序列准备用来存储结果。
A2对员工表循环。B2和C2取出当前员工的编号和姓名。B3开始循环查找他的上级,C3在关系表中找到他的直属上级,如果没有领导者了说明完成查找,退出循环。如果找到直属上级,则C5在员工表中找到领导者的姓名,并在B2的员工姓名前添加领导者姓名,并更新B2中的编号后,继续查找领导者的上级。如果查找完毕,则在C1中记录一条结果。
所有员工的信息查找完毕后,按照要求A8将结果排序后返回:
可以使用SPL中的关联计算,更方便地得到结果:
A |
|
1 |
=T("Employees2.txt").keys(EMPNO) |
2 |
=T("Relationships.txt").keys(EMPNO) |
3 |
=A1.join(EMPNO, A2, MGR) |
4 |
>A3.switch(MGR,A3) |
5 |
=A3.(~.prior(MGR).(ENAME).rvs().concat("-")).sort() |
http://try.scudata.com.cn/try.jsp?splx=ExB003lcgljgs2.splx
A1和A2读出员工表和从属关系表,A3将两表连接,在员工表字段的基础上中增加他的领导编号MGR。
A4用外键关联计算,将A3中的领导编号转换为对应的记录。SPL中可以用switch函数执行外键关联,将外键字段转换为对应的维表记录,实现真正的关联,使得计算更为直观便捷。A3中结果如下:
其中MGR数据显示的颜色和EMPNO是不同的,就是因为已经被转换为了对应的记录,可以双击查看,如双击7698后可以查看对应编号员工的数据:
双击MGR字段还可以继续查看他的直属上级。
A5循环计算每位员工的管理层信息,计算时用prior函数查找他的各级MGR,直到找不到为止,并取出他们的ENAME,此时得到的结果是从低级到高级的,因此需要用rvs函数将其倒序排列,用concat即可得到所需的层级关系串。排序后得到的结果和前一种方法是一致的。
Employees2.txt
Relationships.txt
英文版