select * from emp;
select empno,ename,job,mgr,deptno,level,sys_connect_by_path(ename,'/'),connect_by_root(ename)
from emp
start with mgr is null
connect by prior empno=mgr
order by level,empno;
WITH T(empno, ename, job, mgr, deptno, the_level, path,top_manager) AS ( ---- 必須把結構寫出來
SELECT empno, ename, job, mgr, deptno ---- 先寫錨點查詢,用START WITH的條件
,1 AS the_level ---- 遞歸起點,第一層
,'\'||ename ---- 路徑的第一截
,ename AS top_manager ---- 原來的CONNECT_BY_ROOT
FROM EMP
WHERE mgr IS NULL ---- 原來的START WITH條件
UNION ALL ---- 下面是遞歸部分
SELECT e.empno, e.ename, e.job, e.mgr, e.deptno ---- 要加入的新一層數據,來自要遍歷的emp表
,1 + t.the_level ---- 遞歸層次,在原來的基礎上加1。這相當於CONNECT BY查詢中的LEVEL偽列
,t.path||'\'||e.ename ---- 把新的一截路徑拼上去
,t.top_manager ---- 直接繼承原來的數據,因為每個路徑的根節點只有一個
FROM t, emp e ---- 典型寫法,把子查詢本身和要遍歷的表作一個連接
WHERE t.empno = e.mgr ---- 原來的CONNECT BY條件
) ---- WITH定義結束
SELECT * FROM T