Oracle connect by父子行,岗位层级

connect by 用于存在父子,祖孙,上下级等层级关系的数据表进行层级查询。

语法格式:
{ CONNECT BY [ NOCYCLE ] condition [AND condition]... [ START WITH condition ] | START WITH condition CONNECT BY [ NOCYCLE ] condition [AND condition]...}

特殊词讲解

start with: 指定起始节点的条件

connect by: 指定父子行的条件关系

prior: 查询父行的限定符,格式: prior column1 = column2 or column1 = prior column2 and ... ,

nocycle: 若数据表中存在循环行,那么不添加此关键字会报错,添加关键字后,便不会报错,但循环的两行只会显示其中的第一条

循环行: 该行只有一个子行,而且子行又是该行的父行

connect_by_iscycle: 前置条件:在使用了nocycle之后才能使用此关键字,用于表示是否是循环行,0表示否,1 表示是

connect_by_isleaf: 是否是叶子节点,0表示否,1 表示是

level: level伪列,表示层级,值越小层级越高,level=1为层级最高节点

自定义数据:

-- 创建表
create table TEST_EMPLOYEE(
	EMP_ID number,--员工编码
	LEAD_ID number,--上级编码
	EMP_NAME varchar2(50),--员工姓名
	SALARY number,--员工薪资
	DEPT_NO varchar2(8)--部门编号
	);

-- 添加数据
insert into TEST_EMPLOYEE values('1',0,'king','1000000.00','001');
insert into TEST_EMPLOYEE values('2',1,'jack','50500.00','002');
insert into TEST_EMPLOYEE values('3',1,'arise','60000.00','003');
insert into TEST_EMPLOYEE values('4',2,'scott','30000.00','002');
insert into TEST_EMPLOYEE values('5',2,'tiger','25000.00','002');
insert into TEST_EMPLOYEE values('6',3,'wudde','23000.00','003');
insert into TEST_EMPLOYEE values('7',3,'joker','21000.00','003');
commit;

1、查询所有下级

select 
	EMP_ID,LEAD_ID,EMP_NAME,prior EMP_NAME as lead_name,SALARY
from TEST_EMPLOYEE
start with LEAD_ID=1
connect by prior EMP_ID = LEAD_ID;

 

 2、查询所有下级包括自己

select 
	EMP_ID,LEAD_ID,EMP_NAME,prior EMP_NAME as lead_name,SALARY
from TEST_EMPLOYEE
start with EMP_ID=1
connect by prior EMP_ID = LEAD_ID;

 

3、查询所有上级包括自己

select 
	EMP_ID,LEAD_ID,EMP_NAME,SALARY
from TEST_EMPLOYEE 
start with EMP_ID=6
connect by prior LEAD_ID = EMP_ID;

 

4、查询自己的直属上级的同一级人员,但是不包含自己的直属上级

with t as (
	select
		TEST_EMPLOYEE.*,prior EMP_NAME,level le
	from TEST_EMPLOYEE 
	start with LEAD_ID = 0
	connect by LEAD_ID=prior EMP_ID
	)
select 
	t.*
from t 
left join t tt 
	on tt.EMP_ID = 6
where t.le = (tt.le-1)
	and t.EMP_ID <> tt.LEAD_ID;

 

5、查询自己的同级人员,但是不包含自己

with t as (
	select 
		TEST_EMPLOYEE.*,prior EMP_NAME,level le
	from TEST_EMPLOYEE 
	start with LEAD_ID=0
	connect by LEAD_ID= prior EMP_ID
	)
select 
	t.*
from t t
left join t tt 
	on tt.EMP_ID = 5
where t.le = tt.le 
	and t.EMP_ID <> tt.EMP_ID;	

 

6、level伪列的使用,格式化层级

select 
	lpad(' ',level*2,' ') || EMP_NAME as name,EMP_ID,LEAD_ID,SALARY,level
from TEST_EMPLOYEE
start with LEAD_ID = 0
connect by prior EMP_ID = LEAD_ID

 

7、connect_by_root 查找部门内部的全部人员与部门老大

select 
	connect_by_root EMP_NAME,EMP_NAME,LEAD_ID,SALARY
from TEST_EMPLOYEE  
where DEPT_NO='002'
start with LEAD_ID=1
connect by prior EMP_ID = LEAD_ID;

 

插入一条数据,与另一条EMP_ID=7的数据组成循环行

insert into TEST_EMPLOYEE values(3,7,'joker_cycle','21000.00','003');
commit;

 

8、查询下级(含有循环的数据)

select 
	EMP_ID,EMP_NAME,LEAD_ID,SALARY,connect_by_iscycle as cycle --标注是否循环
from TEST_EMPLOYEE 
start with LEAD_ID=3
connect by nocycle prior EMP_ID = LEAD_ID;

 

9、--查询是否叶节点(即自己是否还有下级,0表示没有,1表示有)

select 
	EMP_ID,EMP_NAME,LEAD_ID,SALARY,connect_by_isleaf
from TEST_EMPLOYEE
start with LEAD_ID=0
connect by nocycle prior EMP_ID=LEAD_ID;

 

发布了35 篇原创文章 · 获赞 7 · 访问量 3330

猜你喜欢

转载自blog.csdn.net/Hjchidaozhe/article/details/103958576