oracle sql 高階程式設計學習筆記(二十五)
阿新 • • 發佈:2018-11-21
connect by 遞迴查詢例項演示
1、 connect by 演示
遞迴檢視所有員工之間組織關係
select lpad(' ', level * 2 - 1, ' ') || emp.last_name emp_last_name, -- level 偽列儲存了遞迴的深度值 level =2 表示 遞迴了2-1層,即只查詢KING id為100的所有直接下屬 見下面偽列演示 --這裡時通過空格來表示遞迴深度關係 emp.first_name emp_first_name, emp.employee_id, emp.manager_id, mgr_last_name from (select /*+ inline gather_plan_statistics*/e.last_name, e.first_name, e.employee_id, e.manager_id, es.last_name mgr_last_name from employees e left outer join employees es on es.employee_id = e.manager_id) emp connect by prior emp.employee_id = emp.manager_id -- 擴充套件 prior 在左邊表示 查詢下級,在右變表示 求上級 start with emp.manager_id is null order siblings by emp.last_nameL;
擴充套件 :order siblings by 表示兄弟姐妹之間的排序 只針對樹結構結果集,
詳見 https://blog.csdn.net/niuhea/article/details/8596307
查詢結果如下:
2、level 偽列演示
select emp.last_name emp_last_name, emp.first_name emp_first_name, emp.employee_id, emp.manager_id, mgr_last_name from (select /*+ inline gather_plan_statistics*/e.last_name, e.first_name, e.employee_id, e.manager_id, es.last_name mgr_last_name from employees e left outer join employees es on es.employee_id = e.manager_id) emp where level =2 connect by prior emp.employee_id = emp.manager_id start with emp.manager_id is null order siblings by emp.last_name;
因為 start with指定了遞迴開始是從King開始,而level 空值遞迴深度,即這樣只查出KING的所有直接下級,共14人,
查詢結果:
3、擴充套件演示:查詢上級
檢視所有206員工的所有上級
select emp.last_name emp_last_name, emp.first_name emp_first_name, emp.employee_id, emp.manager_id, mgr_last_name from (select /*+ inline gather_plan_statistics*/e.last_name, e.first_name, e.employee_id, e.manager_id, es.last_name mgr_last_name from employees e left outer join employees es on es.employee_id = e.manager_id) emp connect by emp.employee_id = prior emp.manager_id start with emp.employee_id='206' order siblings by emp.last_name;
同樣這裡也可以通過level 來控制檢視所有上級還是直接上級,還是上級的上級……