有空的人帮我看看吧,自己写了个语句,做了好多子查询感觉太不优化了。
有数据表 SYS_USER(员工表): 字段 USERID(主键),USERNAME(姓名),CERTIFICATE_NO(身份证),DEPT(部门),JOB(岗位),JOIN_DATE(入职日期),CONTRACT_END_DATE(合同终止日期),LEAVE_DATE(离职日期),STATUS(状态);
         STAFF_CONTRACT(续约表): USERID,CONTRACT_BEGIN_DATE(合同开始日期),CONTRACT_END_DATE(合同终止日期);
         EMPLOYEE_FORMAL(转正表):USERID,FORMAL_DATE(生效日期);
         USER_CHG_HIS(调配表):USERID,ORG_DEPT(原部门),ORG_JOB(原职位),NEW_DEPT(新职位),NEW_JOB(新部门),FORMAL_DATE(生效日期);
     同一个人可以多次入职,但再次入职会在人员表中新生成记录;
     需要得到是数据是人员轨迹表  每个人的信息都显示成   
     如下:USERID  USERNAME  身份证  部门   职位  生效日期  合同终止日期  状态
            001      张三    xxxxx1  财务   助理  02-08-01   05-08-01     入职
            001      张三    xxxxx1  财务   出纳  02-09-01   05-08-01     调配
            001      张三    xxxxx1  财务   会计  03-08-01   05-08-01     调配
            001      张三    xxxxx1  财务   会计  05-08-01   08-08-01     续约
            001      张三    xxxxx1  财务   经理  06-08-01   05-08-01     调配
            001      张三    xxxxx1  财务   经理  07-07-21   05-08-01     离职
            104      张三    xxxxx1  财务   主管  08-03-11   11-03-11     二次入职
            104      张三    xxxxx1  财务   主管  08-06-21   11-03-11     转正   
人员信息可以根据身份证关联,比较麻烦的是我们每次调配后都会直接把人员表里面的部门,职位直接更新成当前的职位部门
这样在轨迹里面取人员的某个时间的职位就比较麻烦,人员可以多次调配。
    

解决方案 »

  1.   

    你把SQL贴出来让高手们看吧~~估计也不会很复杂吧
      

  2.   

    感觉这个sql逻辑上还是比较复杂的,不知道你对二次入职 这里是怎么处理的哟。可以帖出来一起研究一下。这里不仅要用到子查询,而且还是几个子查询的union才能搞定吧,所以sql的复杂度应该是有的。比较你本身的逻辑就不简单哟。
      

  3.   

    对,我贴个入职的查询 其中我列出来的只是调配里面得到的职位部分
    具体情况还有很多 比如:大区,省区,办事处,部门
    下面是我写的入职部分的语句
    SELECT SU.USERID,
           SU.USERNAME,
           SU.CERTIFICATE_NO,
           SU.EMPLOYEE_NO,
           SU.DEPT_NO,
           DECODE((SELECT ORG_JOB
                    FROM USER_CHG_HIS UCH
                   WHERE UCH.USERID = SU.USERID
                     AND UCH.VALID_DATE =
                         (SELECT MIN(U.VALID_DATE)
                            FROM USER_CHG_HIS U
                           WHERE (U.VALID_DATE >= SU.JOIN_DATE)
                             AND (U.USERID = SU.USERID))),
                  '',
                  SU.JOB_NO,
                  (SELECT ORG_JOB
                     FROM USER_CHG_HIS UCH
                    WHERE UCH.USERID = SU.USERID
                      AND UCH.VALID_DATE =
                          (SELECT MIN(U.VALID_DATE)
                             FROM USER_CHG_HIS U
                            WHERE (U.VALID_DATE >= SU.JOIN_DATE)
                              AND (U.USERID = SU.USERID)))) AS JOB_NO,
           SU.LEADER_ID,
           SU.JOIN_DATE AS DO_DATE,
           SU.CONTRACT_DEADLINE,
           '入职' AS STATUS
      FROM SYS_USER SU
    我现在的做法是将所有状态的查询结果用UNION连在一起
    但是中间很多处理还不知道如何做
    比如2次入职的判断,而且感觉这样的语句太繁琐了,麻烦高手帮忙看看。
      

  4.   

    二次入职可以最后处理,因为1个USERID只能入职一次如果是二次入职可以再最后用身份证去判断。
      

  5.   

    我的做法是在人员表中找出这个人的基本信息,如果这个人有过调配,就找出调配生效日期最小的那条记录,可以从中得到原职位,原部门等信息;如果没有调配就直接取人员表的信息。
    其他状态也一样,最后用UNION连接在一起。