列出管理结构树
Employees.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("Employees.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() |
https://try.esproc.com/splx?4kx
A1读出员工数据并指定EMPNO为主键,A2读出从属关系表,同样设置了主键。C1准备了空序列准备用来存储结果。
A2对员工表循环。B2和C2取出当前员工的编号和姓名。B3开始循环查找他的上级,C3在关系表中找到他的直属上级,如果没有领导者了说明完成查找,退出循环。如果找到直属上级,则C5在员工表中找到领导者的姓名,并在B2的员工姓名前添加领导者姓名,并更新B2中的编号后,继续查找领导者的上级。如果查找完毕,则在C1中记录一条结果。
所有员工的信息查找完毕后,按照要求A8将结果排序后返回:
可以使用SPL中的关联计算,更方便地得到结果:
A | |
1 | =T("Employees.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() |
https://try.esproc.com/splx?4sK
A1和A2读出员工表和从属关系表,A3将两表连接,在员工表字段的基础上中增加他的领导编号MGR。
A4用外键关联计算,将A3中的领导编号转换为对应的记录。SPL中可以用switch函数执行外键关联,将外键字段转换为对应的维表记录,实现真正的关联,使得计算更为直观便捷。A3中结果如下:
其中MGR数据显示的颜色和EMPNO是不同的,就是因为已经被转换为了对应的记录,可以双击查看,如双击7698后可以查看对应编号员工的数据:
双击MGR字段还可以继续查看他的直属上级。
A5循环计算每位员工的管理层信息,计算时用prior函数查找他的各级MGR,直到找不到为止,并取出他们的ENAME,此时得到的结果是从低级到高级的,因此需要用rvs函数将其倒序排列,用concat即可得到所需的层级关系串。排序后得到的结果和前一种方法是一致的。
Employees.txt
Relationships.txt
英文版