【发布时间】:2018-09-27 11:40:24
【问题描述】:
典型员工数据http://sqlfiddle.com/#!9/41d151/1/0作为示例数据
我需要得到这样的结果
+-----+-----------+-------+
| ID | NAME | rnum |
+-----+-----------+-------+
| 100 | King | 1 |
| 102 | De Haan | 1.1 |
| 103 | Hunold | 1.1.1 |
| 148 | Cambrault | 1.2 |
| 170 | Fox | 1.2.1 |
| 169 | Bloom | 1.2.3 |
| <...> |
| 147 | Errazuriz | 1.3 |
| 166 | Ande | 1.3.1 |
| 167 | Banda | 1.3.2 |
| <...>
| 521 | Smith | 5.14.3|
+-----+-----------+-------+
主要问题是 rnum 生成。我无法将 e.level_ 传递给子查询。
WITH data AS (-- more useful employee list
SELECT id, name, level_order, level level_, manager_id, CONNECT_BY_ROOT id root_manager
FROM employee
CONNECT BY PRIOR employee_id = manager_id
START WITH manager_id IS null
ORDER BY level, level_order)
SELECT e.id, e.name, sys_connect_by_path((SELECT e2.rnum
FROM (-- employee at same level, sorted and numerated
SELECT row_number() OVER (ORDER BY t.level_order) rnum, t.employee_id
FROM data t
WHERE t.level_ = e.level_
ORDER BY t.level_order) e2
WHERE e2.employee_id = e.employee_id), '.')
FROM employee e
CONNECT BY PRIOR e.employee_id = e.manager_id
START WITH e.manager_id is null
/
有没有办法将 level 传递给嵌套查询? 或者以更优雅的方式查询相同的数据?对我来说,这似乎是一种常见的情况。
【问题讨论】:
-
为什么要存储过程?您已经为 PL/SQL 添加了标记,表明您想要一个存储过程或函数作为答案。
-
查询。允许使用 PL/SQL 函数。
标签: sql oracle plsql hierarchy