有2个表。CORP 为部门表。 EMPLOYEE 为员工表。EMPLOYEE 表 中
EMPLOYEENO 员工号
CORPCODE 所属部门代码CORP 表中
CORPCODE 部门代码
PARECODE 上级部门
CORPTYPE 部门类型问题:求一个员工,部门类型为0002 的部门代码。我想这个是不是得用递归去做啊? 有没有什么好办法?可以用存储过程来完成,谢谢各位大虾!!
EMPLOYEENO 员工号
CORPCODE 所属部门代码CORP 表中
CORPCODE 部门代码
PARECODE 上级部门
CORPTYPE 部门类型问题:求一个员工,部门类型为0002 的部门代码。我想这个是不是得用递归去做啊? 有没有什么好办法?可以用存储过程来完成,谢谢各位大虾!!
还是你想表达的是如果是002类型的子部门的也算呢?
---问题:求一个员工,部门类型为0002 的部门代码或者部门类型为0002的子部门代码。(这是不是你要表达?)
select *
from EMPLOYEE a
where a.CORPCODE in
(select b.CORPCODE
from CORP b
start with b.CORPTYPE = '0002'
connect by prior b.CORPCODE = b.PARECODE)
你可以使用oracle中自带的递归查询方式检索数据,只需要一条SQL就可以实现你所需要的查询。with corp as (
select '0001' corpcode, '' parecode, 1 corptype from dual union
select '0002' , '' , 1 from dual union
select '0003' , '0002' , 1 from dual union
select '0004' , '0002' , 1 from dual union
select '0005' , '0001' , 1 from dual union
select '0006' , '0003' , 1 from dual ),
employee as (
select 'A' employeeno, '0001' corpcode from dual union
select 'B' employeeno, '0002' corpcode from dual union
select 'C' employeeno, '0003' corpcode from dual union
select 'D' employeeno, '0004' corpcode from dual union
select 'E' employeeno, '0005' corpcode from dual union
select 'F' employeeno, '0005' corpcode from dual )
-- 上面是模拟测试用数据,不需要引用SELECT * FROM
-- 这个子查询用于递归取出0002部门下的所有部门
(SELECT CORPCODE FROM CORP START WITH CORPCODE = '0002' CONNECT BY PARECODE = PRIOR CORPCODE) CHILDCORP,
EMPLOYEE
WHERE CHILDCORP.CORPCODE = EMPLOYEE.CORPCODE;
我的意思很明确。 就是求出这个员工的工厂编号。员工属于A工厂的人事部。
人事部的上级部门为A工厂。而A工厂的部门类型为0002(为0002的都是工厂)
当然,工厂下面有很多层级关系。集团中有很多工厂,你们懂的。我说不清楚了,疯了。
with corp as (
select 'C0001' corpcode, '' parecode, '0002' corptype from dual union
select 'C0002' , '' , '0002' from dual union
select 'C0003' , 'C0002' , '0003' from dual union
select 'C0004' , 'C0002' , '0003' from dual union
select 'C0005' , 'C0001' , '0003' from dual union
select 'C0006' , 'C0003' , '0004' from dual ),
employee as (
select 'A' employeeno, 'C0001' corpcode from dual union
select 'B' employeeno, 'C0002' corpcode from dual union
select 'C' employeeno, 'C0003' corpcode from dual union
select 'D' employeeno, 'C0004' corpcode from dual union
select 'E' employeeno, 'C0005' corpcode from dual union
select 'F' employeeno, 'C0005' corpcode from dual )
-- 上面是模拟测试用数据,不需要引用SELECT * FROM
(SELECT CORPCODE,CONNECT_BY_ROOT(CORPCODE) ROOTCODE FROM CORP START WITH CORPTYPE = '0002' CONNECT BY PARECODE = PRIOR CORPCODE) CHILDCORP,
EMPLOYEE
WHERE CHILDCORP.CORPCODE = EMPLOYEE.CORPCODE
AND EMPLOYEE.EMPLOYEENO = 'F';
-- ROOTCODE列的值就是你要的结果了