oracle sql advanced programming learning notes (25)

An example of connect by recursive query

1. connect by demo

Recursively view organizational relationships among all employees

select lpad(' ', level * 2 - 1, ' ') || emp.last_name emp_last_name,
-- level Pseudo column holds recursive depth value   level =2 Indicates recursion of 2-1 Layer, that is, query only KING id All direct reports for 100 are shown in the pseudo column below
--Here, the recursion depth relationship is represented by a space
       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
-- extend  prior On the left is to query the lower level, and on the right is to query the upper level
 start with emp.manager_id is null
 order siblings by emp.last_nameL;

Extension: order siblings by means that the sorting between siblings is only for the result set of tree structure,
See for details https://blog.csdn.net/niuhea/article/details/8596307
The query results are as follows:

2. level pseudo column demonstration

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;

Because start with specifies that the recursion starts from King, and level null recursion depth, that is to say, only all direct subordinates of king are found, 14 people in total,
Query results:

3. Extension Demo: query superior

View all superiors of all 206 employees

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;

Also, you can use level to control whether to view all superiors, direct superiors or superior superiors

Added by NathanLedet on Tue, 24 Dec 2019 18:12:07 +0200