Как вывести только путь иерархии от непосредственного руководителя до заданого подчинённого?

Надо вывести только путь иерархии от непосредственного руководителя заданого подчинённого до самого подчинённого.

Например, /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 шт):

Автор решения: 0xdb

выдать только путь иерархии непосредственного руководителя этого подчинённого и его самого

Самое простое решение, обойтись без иерархического запроса, а использовать обычное соединение таблиц:

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
→ Ссылка