You can use a recursive sub-query factoring clause for this:
WITH hierarchy (empID, empName, subBoss, subBossName, boss, bossName, depth, managerId) AS (
SELECT empID,
empName,
CAST(NULL AS NUMBER),
CAST(NULL AS VARCHAR2(20)),
CAST(NULL AS NUMBER),
CAST(NULL AS VARCHAR2(20)),
1,
managerID
FROM empTbl
UNION ALL
SELECT h.empID,
h.empName,
CASE h.depth
WHEN 1 THEN e.empID
ELSE h.subBoss
END,
CASE h.depth
WHEN 1 THEN e.empName
ELSE h.subBossName
END,
CASE h.depth
WHEN 2 THEN e.empID
ELSE h.boss
END,
CASE h.depth
WHEN 2 THEN e.empName
ELSE h.bossName
END,
h.depth + 1,
e.managerID
FROM hierarchy h
LEFT OUTER JOIN empTbl e
ON (h.managerID = e.empID)
WHERE depth < 3
)
CYCLE empID, depth SET is_cycle TO 1 DEFAULT 0
SELECT empID, empName, subBoss, subBossName, boss, bossName
FROM hierarchy
WHERE depth = 3;
Or, you can use a hierarchical query and pivot:
SELECT emp_id AS empID,
emp_name AS empName,
subboss_id AS subbossid,
subboss_name AS subbossname,
boss_id AS bossid,
boss_name AS bossname
FROM (
SELECT CONNECT_BY_ROOT(empID) AS root_empid,
empID,
empName,
LEVEL AS depth
FROM empTbl
WHERE LEVEL <= 3
CONNECT BY PRIOR managerID = empID
)
PIVOT (
MAX(empID) AS id,
MAX(empName) AS name
FOR depth IN (
1 AS emp,
2 AS subBoss,
3 AS boss
)
)
ORDER BY empid;
Which, for the sample data:
CREATE TABLE empTbl (empID, empName, managerID) AS
SELECT 100, 'Sara', 110 FROM DUAL UNION ALL
SELECT 101, 'Ben', 111 FROM DUAL UNION ALL
SELECT 102, 'Alex', 110 FROM DUAL UNION ALL
SELECT 110, 'Ross', 111 FROM DUAL UNION ALL
SELECT 111, 'Mon', NULL FROM DUAL;
Both output:
EMPID |
EMPNAME |
SUBBOSS |
SUBBOSSNAME |
BOSS |
BOSSNAME |
100 |
Sara |
110 |
Ross |
111 |
Mon |
102 |
Alex |
110 |
Ross |
111 |
Mon |
101 |
Ben |
111 |
Mon |
|
|
110 |
Ross |
111 |
Mon |
|
|
111 |
Mon |
|
|
|
|
db<>fiddle here