1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| WITH e (l, empno, ename, mgr, child) AS (
SELECT 1,empno,ename,mgr,CASE WHEN ename = 'BLAKE' THEN 1 END
FROM emp WHERE mgr IS NULL
UNION ALL
SELECT e.l + 1, f.empno, f.ename, f.mgr,
CASE WHEN f.ename != 'BLAKE' THEN e.child ELSE 1 END
FROM emp f, e WHERE e.empno = f.mgr)
SEARCH DEPTH FIRST BY ename SET ord,
m (empno, mgr) AS (
SELECT empno, mgr FROM emp WHERE ename = 'BLAKE'
UNION ALL
SELECT f.empno, f.mgr FROM emp f, m WHERE m.mgr = f.empno)
SELECT l,lpad(' ',l*3-3)||ename,empno,mgr FROM e
WHERE child = 1 OR empno IN (SELECT mgr FROM m)
ORDER BY ord; |
Partager