Как вывести только путь иерархии от непосредственного руководителя до заданого подчинённого?
Надо вывести только путь иерархии от непосредственного руководителя заданого подчинённого до самого подчинённого.
Например, /FORD/SMITH, хотя полный путь из запроса ниже будет: /KING/JONES/FORD/SMITH.
SELECT level, lpad(' ', 5*level)||ename "ename",
SYS_CONNECT_BY_PATH(ename, '/') "Path"
FROM employees
WHERE deptno = 20 OR deptno = 30
START WITH mgr is NULL
connect by prior empno = mgr
ORDER SIBLINGS by ename;
Ответы (1 шт):
выдать только путь иерархии непосредственного руководителя этого подчинённого и его самого
Самое простое решение, обойтись без иерархического запроса, а использовать обычное соединение таблиц:
select e.last_name, '/'||coalesce (m.last_name, 'no-mgr')||'/'||e.last_name path
from hr.employees e
left join hr.employees m on m.employee_id = e.manager_id
where e.last_name = 'Fay'
/
LAST_NAME PATH
------------------------- ----------------------------------------------------
Fay /Hartstein/Fay
Если же надо решение с иерархическим запросом (например, это учебное задание), то можно сначала обратным иерархическим запросом найти непосредственного руководителя(ей), а затем от него(них) построить прямой иерархический запрос:
select last_name "ename", sys_connect_by_path (last_name, '/') "Path"
from (
select level lvl, employee_id, manager_id, last_name
from hr.employees
start with last_name = 'Fay'
connect by employee_id = prior manager_id and level <= 2
)
where level = 2
start with lvl = 2
connect by prior employee_id = manager_id
/
ename Path
------------------------- --------------------------------
Fay /Hartstein/Fay
В ответе используется стандартная схема примеров:
select employee_id, last_name, job_id, manager_id, department_id
from hr.employees
where department_id = 20
/
EMPLOYEE_ID LAST_NAME JOB_ID MANAGER_ID DEPARTMENT_ID
----------- ------------------------- ---------- ---------- -------------
201 Hartstein MK_MAN 100 20
202 Fay MK_REP 201 20