Найти старшего менеджера данного сотрудника без предложения «Connect by Prior» в оракуле - PullRequest
0 голосов
/ 25 июня 2018

Я уже написал запрос, чтобы найти старшего менеджера данного сотрудника, использующего connect by before, но мне нужно избегать Connect by Prior

Исходная таблица:

Employee_Id Manager Id
1            10
10           20
20           Null
2             5
5             7
7            null
3            6
6           Null

Таблица OutPut

Input          Output
Employee_id    Employee_ID
1              20
2               7
3               6
5               7

Мой подход:

select * from (
SELECT *
FROM EMPLOYEEs 
START WITH EMPLOYEE_ID = 103
CONNECT BY EMPLOYEE_ID = PRIOR MANAGER_ID
) where manager_id is null

Альтернативный подход:

with cte (EMPLOYEE_ID,MANAGER_ID,lev) as (
      select EMPLOYEE_ID, MANAGER_ID, 0 as lev
      from employees
      union all
      select cte.EMPLOYEE_ID, employees.MANAGER_ID, lev + 1
      from cte join
           employees
           on cte.MANAGER_ID = employees.EMPLOYEE_ID

     )
    select * from cte where employee_id=103 and MANAGER_ID is null;

, но неполучение ожидаемого результата с альтернативным подходом.

1 Ответ

0 голосов
/ 25 июня 2018

В вашем рекурсивном факторинге подзапроса вам нужно идентифицировать корневой employee_id и использовать его в вашем последнем запросе, например так:

WITH your_table AS
 (SELECT 1 employee_id, 10 manager_id FROM dual UNION ALL
  SELECT 10 employee_id, 20 manager_id FROM dual UNION ALL
  SELECT 20 employee_id, NULL manager_id FROM dual UNION ALL
  SELECT 2 employee_id, 5 manager_id FROM dual UNION ALL
  SELECT 5 employee_id, 7 manager_id FROM dual UNION ALL
  SELECT 7 employee_id, NULL manager_id FROM dual UNION ALL
  SELECT 3 employee_id, 6 manager_id FROM dual UNION ALL
  SELECT 6 employee_id, NULL manager_id FROM dual),
recursive(employee_id,
          manager_id,
          root_emp_id) AS
 (SELECT employee_id,
         manager_id,
         employee_id root_emp_id
  FROM   your_table
  WHERE  manager_id IS NOT NULL
  UNION ALL
  SELECT yt.employee_id,
         yt.manager_id,
         r.root_emp_id
  FROM   recursive r
  INNER  JOIN your_table yt
  ON     r.manager_id = yt.employee_id)
SELECT root_emp_id employee_id,
       employee_id ultimate_manager_id
FROM   recursive
WHERE  manager_id IS NULL
ORDER BY employee_id;

EMPLOYEE_ID ULTIMATE_MANAGER_ID
----------- -------------------
          1                  20
          2                   7
          3                   6
          5                   7
         10                  20

Это имитирует функцию connect_by_root при подключении иерархическими запросами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...