1,需求: 部门有4级部门,部门表以树状存储。营业部分类, e.g. 全体营业部-***营业部 --运维 ,员工表中存储的部门ID为最低级的部门,既运维,营业部人员需显示各营业部,既二级部门。总公司人员则显示一级部门。正则表达式
select
cdep.psncode,
cdep.psnname,
cdep.officephone,
cdep.id,
cdep.mobile,
cdep.addr,
cdep.email,
cdep.deptcode,
cdep.pk_depde ,
adep.deptcode,
adep.deptname
from (
select emp.pk_deptdoc,
emp.psncode,
emp.psnname,
emp.officephone,
emp.id,
emp.mobile,
emp.addr,
emp.email,
dep1.deptcode,
dep1.deplevel1,
dep1.deplevel2,
dep1.deplevel3,
dep1.deplevel4,
dep1.deptname,
case when dep1.deptcode like '99%'
then dep1.deplevel2
else dep1.deplevel1 end as pk_depde
from rlzy.tcl_employee emp
inner join (select s.deptname,
s.deptcode,
s.pk_deptdoc,
sys_connect_by_path(s.pk_deptdoc, '/') aa,
level,
sys_connect_by_path(s.deptcode, '/') bb,
rtrim(regexp_substr(sys_connect_by_path(s.pk_deptdoc,
'/') || '/',
'.*?' || '/',
1,
2),
'/') as deplevel1,
rtrim(regexp_substr(sys_connect_by_path(s.pk_deptdoc,
'/') || '/',
'.*?' || '/',
1,
3),
'/') as deplevel2,
rtrim(regexp_substr(sys_connect_by_path(s.pk_deptdoc,
'/') || '/',
'.*?' || '/',
1,
4),
'/') as deplevel3,
rtrim(regexp_substr(sys_connect_by_path(s.pk_deptdoc,
'/') || '/',
'.*?' || '/',
1,
5),
'/') as deplevel4
from rlzy.tcl_dept s
start with s.pk_fathedept = ' '
connect by prior s.pk_deptdoc = s.pk_fathedept
order siblings by s.deptcode) dep1 on emp.pk_deptdoc =
dep1.pk_deptdoc) cdep
inner join rlzy.tcl_dept adep
on cdep.pk_depde=adep.pk_deptdoc运维
说明:用了sys_connect_by_path函数,regexp_substr函数,rtrim函数,造成子集并造成映射表。而后用员工表和部门表,去员工和部门ID 。。。树状结构应该仍是用LDAP会比较好。这种形式等因而在行里面与叶子的各个枝,如层级不固定,则不太好弄。树状结构和正则表达式都须要研究,如今就是依照葫芦画瓢ide