有2个表。CORP 为部门表。 EMPLOYEE 为员工表。EMPLOYEE  表 中
EMPLOYEENO 员工号
CORPCODE    所属部门代码CORP 表中  
CORPCODE 部门代码
PARECODE 上级部门
CORPTYPE 部门类型问题:求一个员工,部门类型为0002 的部门代码。我想这个是不是得用递归去做啊? 有没有什么好办法?可以用存储过程来完成,谢谢各位大虾!!

解决方案 »

  1.   

    select * from EMPLOYEE a where exists (select 1 from CORP b where a.CORPCODE=b.CORPCODE  and b.CORPTYPE='002')?
    还是你想表达的是如果是002类型的子部门的也算呢?
      

  2.   


    ---问题:求一个员工,部门类型为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)
      

  3.   


    你可以使用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;
      

  4.   

    8楼不是我想要的结果。 
    我的意思很明确。 就是求出这个员工的工厂编号。员工属于A工厂的人事部。
    人事部的上级部门为A工厂。而A工厂的部门类型为0002(为0002的都是工厂)
    当然,工厂下面有很多层级关系。集团中有很多工厂,你们懂的。我说不清楚了,疯了。
      

  5.   


    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列的值就是你要的结果了