我有一个包含以下字段的表:id、manager\u id和candidate\u name
经理id将指向允许我引用管理链的id。我想生成如下输出:
id |候选人|姓名|经理|一级经理id |一级经理候选人姓名|二级经理id |二级经理候选人姓名|等。。。
我最终想要构建这个结构的csv,这样我就可以在报表中利用它。
到目前为止,我使用了以下查询来接近这一点:
CREATE EXTENSION tablefunc;
SELECT * FROM connectby('job', 'id', 'manager_id', '261', 0, ',') AS t(id int, manager_id int, level int, ord text) order by id;
其输出如下:
id | manager_id | level | ord
-------+------------+-------+--------------------------------------------------
2 | 12 | 3 | 261,226,12,2
3 | 2 | 4 | 261,226,12,2,3
4 | 106 | 4 | 261,226,110,106,4
5 | 4 | 5 | 261,226,110,106,4,5
6 | 86 | 4 | 261,226,12,86,6
7 | 920 | 6 | 261,226,12,86,6,920,7
8 | 86 | 4 | 261,226,12,86,8
9 | 8 | 5 | 261,226,12,86,8,9
10 | 145 | 5 | 261,226,12,4209,145,10
11 | 139 | 7 | 261,226,12,4209,145,10,139,11
12 | 226 | 2 | 261,226,12
13 | 4209 | 4 | 261,226,12,4209,13
14 | 159 | 5 | 261,226,12,69,159,14
15 | 14 | 6 | 261,226,12,69,159,14,15
16 | 110 | 3 | 261,226,110,16
ord列给了我管理链,但是我遇到了一个难题,那就是如何用我要找的mgr级别生成列。这也不一定只存在于sql中。
请注意,管理层可以深入到青少年。感谢您对如何处理此问题的任何想法。
1条答案
按热度按时间7eumitmz1#
如果预先知道层次结构中的最大级别数(例如,3),则有一个选项使用递归查询和条件聚合:
您可以扩展
where
包含更多列的子句来处理其他级别。当给定员工的层次结构耗尽时,会显示更多的列null
价值观。另一方面,如果要根据层次结构中的雇员深度动态创建列,则需要动态sql,这要复杂得多。