我有两张表EMPLOYEE,COMPANY
EMPID START_DATE END_DATE
123 1/05/2015 30/05/2015
COMPANYID EMPID START_DATE END_DATE SALARY
001 123 7/05/2015 15/05/2015 10000
我需要编写一个查询,结果就是这样,
COMPANYID EMPID START_DATE END_DATE SALARY
001 123 1/05/2015 7/05/2015 0
001 123 7/05/2015 14/05/2015 10000
001 123 14/05/2015 30/05/2015 0
类似地,查询应该适用于所有类型的重叠 - 部分和完整。请帮忙。
答案 0 :(得分:0)
一种选择是将时间线分成几部分,并将所有可能性分开:
然后你可以将所有查询与“union all”一起加入,这将产生这样的查询(我可能已经忘记了一些可能性):
select c.companyid
, e.empid
, e.start_date
, e.end_date
, 0
from company c
, employee e
where e.empid = c.empid
and e.end_date <= c.start_date
union all
select c.companyid
, e.empid
, e.start_date
, c.start_date
, 0
from company c
, employee e
where e.empid = c.empid
and e.start_date <= c.start_date
and e.end_date > c.start_date
union all
select c.companyid
, e.empid
, c.start_date
, e.end_date
, c.salary
from company c
, employee e
where e.empid = c.empid
and e.start_date <= c.start_date
and e.end_date > c.start_date
and e.end_date <= c.end_date
union all
select c.companyid
, e.empid
, c.start_date
, c.end_date
, c.salary
from company c
, employee e
where e.empid = c.empid
and e.start_date <= c.start_date
and e.end_date > c.end_date
union all
select c.companyid
, e.empid
, c.end_date
, e.end_date
, 0
from company c
, employee e
where e.empid = c.empid
and e.start_date <= c.start_date
and e.end_date > c.end_date
,结果将是:
companyid empid start_date end_date salary
1 123 5/1/2015 5/7/2015 0
1 123 5/7/2015 5/15/2015 10000
1 123 5/15/2015 5/30/2015 0