0

I am having below data

Current Data

Emp id  Emp Name    Manger ID
100     Employee    101
101     Team Lead   102
102     Manager     103
103     Sr. Manager 104
104     Director    105
105     VP          0

Expected Data:

Emp id  Emp Name    Manger ID   Manager Name
105     VP          0           Null
104     Director    105         VP
103     Sr. Manager 104         VP
102     Manager     103         VP
101     Team Lead   102         VP
100     Employee    101         VP

How can we achieve this ??

select c.*
  from (select a.emp_id
              ,a.emp_name
              ,a.manager_id as manager_id
              ,b.emp_name   as manager_name
          from (select emp_id
                      ,emp_name
                      ,manager_id
                  from emp_test
                 WHERE manager_id <> 0) a
              , --parent is present                                   
               (select emp_id
                      ,emp_name
                      ,manager_id
                  from emp_test) b --all records                                  
         where a.manager_id = b.emp_id
        union all
        select emp_id
              ,emp_name
              ,manager_id as manager_id
              ,'' as manager_name
          from emp_test
         WHERE manager_id = 0) c
 ORDER BY 1 desc
         ,2 asc; 
2

2 Answers 2

1

Use a hierarchical query and CONNECT_BY_ROOT to get the manager name at the root of the hierarchy:

Oracle Setup:

CREATE TABLE table_name ( Emp_id, Emp_Name, Manager_ID ) AS
SELECT 100,   'Employee',    101 FROM DUAL UNION ALL
SELECT 101,   'Team Lead',   102 FROM DUAL UNION ALL
SELECT 102,   'Manager',     103 FROM DUAL UNION ALL
SELECT 103,   'Sr. Manager', 104 FROM DUAL UNION ALL
SELECT 104,   'Director',    105 FROM DUAL UNION ALL
SELECT 105,   'VP',          0 FROM DUAL;

Query:

SELECT t.*,
       CASE WHEN Manager_id <> 0 THEN CONNECT_BY_ROOT( Emp_Name ) END AS Manager_Name
FROM   table_name t
START WITH Manager_Id = 0
CONNECT BY PRIOR Emp_id = Manager_ID

Output:

EMP_ID | EMP_NAME    | MANAGER_ID | MANAGER_NAME
-----: | :---------- | ---------: | :-----------
   105 | VP          |          0 | null        
   104 | Director    |        105 | VP          
   103 | Sr. Manager |        104 | VP          
   102 | Manager     |        103 | VP          
   101 | Team Lead   |        102 | VP          
   100 | Employee    |        101 | VP          

db<>fiddle here

Sign up to request clarification or add additional context in comments.

Comments

0

You can use this query:

select emp_id, emp_name, manager_id, prior emp_name as manager_name
from emp_test
start with manager_id = 0
connect by prior emp_id = manager_id;

Note that this will output:

EMP_ID  EMP_NAME    MANAGER_ID MANAGER_NAME
105     VP          0   
104     Director    105        VP
103     Sr. Manager 104        Director
102     Manager     103        Sr. Manager
101     Team Lead   102        Manager
100     Employee    101        Team Lead

So not always "VP" in the last column, like you had it.

If the manager name should always be the top-level manager, then:

select emp_id, emp_name, manager_id,
       case when manager_id <> 0 then connect_by_root emp_name end as manager_name
from emp_test
start with manager_id = 0
connect by prior emp_id = manager_id;

Output:

EMP_ID  EMP_NAME    MANAGER_ID MANAGER_NAME
105     VP          0   
104     Director    105        VP
103     Sr. Manager 104        VP
102     Manager     103        VP
101     Team Lead   102        VP
100     Employee    101        VP

2 Comments

your Statement does not produce the correct result. in example manager_name should be VP
@hotfix, see addition to my answer.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.