表org_member(人员信息)ID Name org_department_id org_account_id
---------------------------------------------------------
c001 张三 a01 b01
c002 李四 a04 b01
c003 王五 a05 b02
c004 陈丽 a06 b01
c005 刘勇 a07 b01
c006 赵东 a08 b01
c007 马晓 a02 b03
c008 宁可 a03 b04
表org_department(部门信息)ID Name org_account_id path
---------------------------------------------------------
a01 财务部 b01 01.02
a02 人事部 b01 01.03
a03 业务部 b03 01.04
a04 综合科 b03 01.03.01
a05 综合科 b03 01.02.01
a06 后勤科 b03 01.04.01
a07 后勤科 b01 01.02.01
a08 出纳科 b01 01.02.02表org_account(单位信息)ID Name
---------------------------------------------------------
b01 华北区
b02 华东区
b03 华南区
b04 华西区最终要实现的查询结果:ID Name 单位名称 部门名称 二级部门名称
-------------------------------------------------------------
c001 张三 华北区 财务部
c002 李四 华北区 业务部 综合科
c003 王五 华东区 财务部 综合科
c004 陈丽 华北区 业务部 后勤科
c005 刘勇 华北区 财务部 后勤科
c006 赵东 华北区 财务部 出纳科
c007 马晓 华南区 人事部
c008 宁可 华西区 业务部其中需要说明的是:表org_department 表中的path 字段,他表示部门的层次等级关系,要特别留意。
select id,name,deptname,accname,e.name subdept from
(select a.*,b.id deptid,b.name deptname,b.path deptpath,c.id accid,c.name accname from org_member a
left join org_department b on a.org_department_id= b.id
left join ora_account c on a.org_account_id=c.id
) d
left join org_account e on d.deptpath=e.path
(select Name from org_department where path = tab2.path) erji_name from (
select a.id,a.name,b.name dwmc,c.name qy,strsub(path,1,5) yiji,path from (
(select id,name,org_department_id,org_account_id from org_member ) a
left outer join
(select id,name,path from org_department) b
on a.org_department_id = b.id
left outer join
(select id,name from org_account) c
on a.org_account_id = c.id ) tab ) tab2join后嵌套下..比较容易~
select disctinct a.id as ID,
a.name as Name,
c.name as 单位名称,
b.name as 部门名称,
e.Name as 二级部门名称
from org_member a,org_department b,org_account c,(select Name,ID from org_department where LENGTH(path ) = 5) e where a.org_account_id = b.org_account_id and b.id = c.id a.org_department_id=e.id;
select e.member_id,e.member_name, e.acount_name,e.department_name,f.NAME from (
select d.PATH,d.NAME from org_department d where length(d.PATH)=8
) f right join
(select b.id member_id,b.name member_name,a.name acount_name,c.NAME department_name ,c.PATH from
org_account a , org_member b, org_department c
where b.ORG_DEPARTMENT_ID = c.ID(+) and b.ORG_ACCOUNT_ID = a.id(+)
group by b.id,b.name,a.name,c.NAME ,c.PATH
)e
on substr(f.path,0,5) = substr(e.path,0,5)
group by e.member_id,e.member_name, e.acount_name,e.department_name,f.NAME
,他的上一级肯定是01.03,但是长度不见得固定,要以"."作为分级的标准来考虑,
ID varchar2(10),
Name varchar2(16),
org_department_id varchar2(8),
org_account_id varchar2(8)
);INSERT INTO org_member(ID,Name,org_department_id,org_account_id) values('c001','张三','a01','b01');
INSERT INTO org_member(ID,Name,org_department_id,org_account_id) values('c002','李四','a04','b01');
INSERT INTO org_member(ID,Name,org_department_id,org_account_id) values('c003','王五','a05','b02');
INSERT INTO org_member(ID,Name,org_department_id,org_account_id) values('c004','陈丽','a06','b01');
INSERT INTO org_member(ID,Name,org_department_id,org_account_id) values('c005','刘勇','a07','b01');
INSERT INTO org_member(ID,Name,org_department_id,org_account_id) values('c006','赵东','a08','b01');
INSERT INTO org_member(ID,Name,org_department_id,org_account_id) values('c007','马晓','a02','b03');
INSERT INTO org_member(ID,Name,org_department_id,org_account_id) values('c008','宁可','a03','b04');COMMIT;CREATE TABLE org_department(
ID varchar2(10),
Name varchar2(16),
org_account_id varchar2(8)
path varchar2(100)
);INSERT INTO org_department(ID,Name,org_account_id,path) values('a01','财务部','b01','01.02');
INSERT INTO org_department(ID,Name,org_account_id,path) values('a02','人事部','b01','01.03');
INSERT INTO org_department(ID,Name,org_account_id,path) values('a03','业务部','b03','01.04');
INSERT INTO org_department(ID,Name,org_account_id,path) values('a04','综合科','b03','01.03.01');
INSERT INTO org_department(ID,Name,org_account_id,path) values('a05','综合科','b03','01.02.01');
INSERT INTO org_department(ID,Name,org_account_id,path) values('a06','后勤科','b03','01.04.01');
INSERT INTO org_department(ID,Name,org_account_id,path) values('a07','后勤科','b01','01.02.01');
INSERT INTO org_department(ID,Name,org_account_id,path) values('a08','出纳科','b01','01.02.02');COMMIT;CREATE TABLE org_account(
ID varchar2(10),
Name varchar2(16)
);INSERT INTO org_account(ID,Name) values('b01','华北区');
INSERT INTO org_account(ID,Name) values('b02','华东区');
INSERT INTO org_account(ID,Name) values('b03','华南区');
INSERT INTO org_account(ID,Name) values('b04','华西区');COMMIT;
-- 楼主:求别人帮忙,一些搭建的测试代码,最好自己事先给出!这样:别人为您这问题的解答欲望会强一些!
(case when od1.Name not like '%部' then od2.Name else od1.Name end) as "部门名称",
(case when od1.Name like '%科' then od1.Name else '' end) as "二级部门名称"
FROM org_member om left join org_account oa on oa.ID = om.org_account_id
left join org_department od1 on od1.ID = om.org_department_id
left join org_department od2 on substr('.'||od1.path||'.',instr('.'||od1.path||'.','.',1,1)+1,instr('.'||od1.path||'.','.',1,2)-instr('.'||od1.path||'.','.',1,1)-1)=substr(od2.ID,2)
ORDER BY om.ID;
ID NAME 单位名称 部门名称 二级部门名称
-------------------- ---------- -------------------------------- -------------------------------- --------------------------------
c001 张三 华北区 财务部
c002 李四 华北区 财务部 综合科
c003 王五 华东区 财务部 综合科
c004 陈丽 华北区 财务部 后勤科
c005 刘勇 华北区 财务部 后勤科
c006 赵东 华北区 财务部 出纳科
c007 马晓 华南区 人事部
c008 宁可 华西区 业务部已选择8行。