有空的人帮我看看吧,自己写了个语句,做了好多子查询感觉太不优化了。
有数据表 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 转正
人员信息可以根据身份证关联,比较麻烦的是我们每次调配后都会直接把人员表里面的部门,职位直接更新成当前的职位部门
这样在轨迹里面取人员的某个时间的职位就比较麻烦,人员可以多次调配。
有数据表 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 转正
人员信息可以根据身份证关联,比较麻烦的是我们每次调配后都会直接把人员表里面的部门,职位直接更新成当前的职位部门
这样在轨迹里面取人员的某个时间的职位就比较麻烦,人员可以多次调配。
解决方案 »
- 用oracle的存储过程返回一个查询的结果集
- 关于ORACLE APACHE服务器的配置
- 请教,安装oracle10g对计算机有什么要求?
- 有关数据库远程连接的几个问题
- 把多行sql语句,存储在以.sql为后缀的文本文件里,用Web语言(php,asp ,jsp)一次调用执行所有的sql语句
- 请问怎样写oracle的sql语句,使得只取select结果的前50行?
- 关于一个函数调用的问题
- 高分相送,Oracle Database Configuation Asssistant点击后没任何反应?
- 如何在pl/sql Develper中写存储过程
- You are attempting to install 64-bit Oracle on a 32-bit operating system. This
- ORA字符变量相加
- oracle数据类型问题
具体情况还有很多 比如:大区,省区,办事处,部门
下面是我写的入职部分的语句
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次入职的判断,而且感觉这样的语句太繁琐了,麻烦高手帮忙看看。
其他状态也一样,最后用UNION连接在一起。