个人看法,一个小建议,那个人员信息库里的部门改为调动后的部门,然后调动表只保留调动前的部门,离职表里应该也不需要部门吧,既然离职了,那人员信息库里保存的应该就是他离职前所在的部门吧,也不知你那具体情况是不是这样,如果改成这样,查询可写成:
在职人员情况:
select * from 人员信息库 where 工号 not in (select 工号 from 离职表)离职人员情况:
select * from 人员信息库 where 工号 in (select 工号 from 离职表)调动人员情况:
select a.工号,a.姓名,b.部门 as 前部门,a.部门 as 后部门
from 人员信息库 a join 调动表 b on a.工号=b.工号不能改的话再说一声,按你这个表做还是可以做的,可能麻烦点:)
在职人员情况:
select * from 人员信息库 where 工号 not in (select 工号 from 离职表)离职人员情况:
select * from 人员信息库 where 工号 in (select 工号 from 离职表)调动人员情况:
select a.工号,a.姓名,b.部门 as 前部门,a.部门 as 后部门
from 人员信息库 a join 调动表 b on a.工号=b.工号不能改的话再说一声,按你这个表做还是可以做的,可能麻烦点:)
前部门(新员工此项为空)、后部门(离职此项为空〕统计在职人员从基本人员表中,条件状态为True即可
统计调动、新员工、离职都从人员调动表即可。
人员信息表(工号、姓名、现在任职部门)
调动表(工号,调动日期,调动前部门)比如查询
8月在职人员情况:
select * from 人员信息库 where 现在任职部门 is not null
and 工号 not in (select 工号 from 调动表 where month(调动日期)<=8)
union
select a.工号,a.姓名,b.调动前部门 from 人员信息库 a
join
(select a.* from 调动表 a join
(select 工号,max(调动日期) rq from 调动表 where month(调动日期)<=8 group by 工号) b
on a.工号=b.工号 and a.调动日期=b.调动日期) b
on a.工号=b.工号8月调动人员情况:
select a.工号,a.姓名,a.现在任职部门,b.调动前部门 from 人员信息库 a
join
(select a.* from 调动表 a join
(select 工号,max(调动日期) rq from 调动表 where month(调动日期)<=8 group by 工号) b
on a.工号=b.工号 and a.调动日期=b.调动日期) b
on a.工号=b.工号8月离职人员情况:
select a.工号,a.姓名 from 人员信息库 where 现在任职部门 is null
and 工号 not in (select 工号 from 调动表 where month(调动日期)>=8)
这种结构应该来说没什么冗余,仅为参考^_^
select a.* from 调动表 a join
(select 工号,max(调动日期) rq from 调动表 where month(调动日期)<=8 group by 工号) b
on a.工号=b.工号 and a.调动日期=b.调动日期
还可以简单点,详见
http://www.csdn.net/expert/topic/1056/1056711.xml?temp=.1621973
扬兄的回答