多表问题

swei0319 2009-08-04 11:00:01
有空的人帮我看看吧,自己写了个语句,做了好多子查询感觉太不优化了。
有数据表 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 转正
人员信息可以根据身份证关联,比较麻烦的是我们每次调配后都会直接把人员表里面的部门,职位直接更新成当前的职位部门
这样在轨迹里面取人员的某个时间的职位就比较麻烦,人员可以多次调配。
...全文
106 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
swei0319 2009-08-04
  • 打赏
  • 举报
回复
二次入职可以最后处理,因为1个USERID只能入职一次

如果是二次入职可以再最后用身份证去判断。
swei0319 2009-08-04
  • 打赏
  • 举报
回复
对,我贴个入职的查询 其中我列出来的只是调配里面得到的职位部分
具体情况还有很多 比如:大区,省区,办事处,部门
下面是我写的入职部分的语句
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次入职的判断,而且感觉这样的语句太繁琐了,麻烦高手帮忙看看。
inthirties 2009-08-04
  • 打赏
  • 举报
回复
感觉这个sql逻辑上还是比较复杂的,不知道你对二次入职 这里是怎么处理的哟。可以帖出来一起研究一下。

这里不仅要用到子查询,而且还是几个子查询的union才能搞定吧,所以sql的复杂度应该是有的。比较你本身的逻辑就不简单哟。
jimmylin040 2009-08-04
  • 打赏
  • 举报
回复
你把SQL贴出来让高手们看吧~~估计也不会很复杂吧
majy 2009-08-04
  • 打赏
  • 举报
回复
子查询没什么不好

把你的语句贴出来看看
swei0319 2009-08-04
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 inthirties 的回复:]
不太明白你是怎么做的。
[/Quote]
我的做法是在人员表中找出这个人的基本信息,如果这个人有过调配,就找出调配生效日期最小的那条记录,可以从中得到原职位,原部门等信息;如果没有调配就直接取人员表的信息。
其他状态也一样,最后用UNION连接在一起。
inthirties 2009-08-04
  • 打赏
  • 举报
回复
不太明白你是怎么做的。
swei0319 2009-08-04
  • 打赏
  • 举报
回复
顶一下!
majy 2009-08-04
  • 打赏
  • 举报
回复
你把表结构和一些少量的数据发上来(文件本件,用“,”分开字段),这个语句可以比较漂亮的写出来的

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧