1. 程式人生 > >oracle sql 高階程式設計學習筆記(二十五)

oracle sql 高階程式設計學習筆記(二十五)

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 來控制檢視所有上級還是直接上級,還是上級的上級……

在這裡插入圖片描述