我有一个employee和employee_history表。对于employee表的每次更新,我都会在employee_history表中插入一条记录。
这两个表都有一个名为生效日期的列,表示员工状态为该生效日期。
以下是我的两张桌子。
我需要在生效日期获得最新的员工记录。
例如,如果我需要获得16岁的员工,我可以从历史表中获取emp_hist_id = 2记录。和6月5日一样,我应该从hist表中获取emp_hist_id = 4。
截至8月15日,我应该从员工表中获取记录。
请帮忙。
答案 0 :(得分:3)
您可以尝试类似
的内容SELECT * FROM (
SELECT * FROM (
(SELECT emp_id, name, email, title, region, division, "effective date"
FROM employee
WHERE emp_id = desired_id)
UNION
(SELECT emp_id, name, email, title, region, division, "effective date"
FROM employee _history
WHERE emp_id = desired_id)
) t
WHERE t."effective date" <= desired_date
ORDER by t."effective date" DESC) p
WHERE ROWNUM = 1
我们的想法是从两个表中获取与所需用户相关的记录,然后将日期低于所需的日期,最后抓住第一个
答案 1 :(得分:1)
您可以在没有分析功能的情况下解决此问题。此处的子查询计算员工生效日期之前历史记录中的最新生效日期:
select e.*
from employee_history eh join
(select e.employee_id, max(eh.effective_date) as latest_effective_date
from employee e join
employee_history eh
on e.employee_id = eh.employee_id and
e.effective_date >= eh.effective_date
) ehl
on eh.employee_id = ehl.employee_id and
eh.effective_date = ehl.effective_date
此解决方案假定历史记录表中没有重复的生效日期。如果有,那么你有另一种选择。假设employee_history_ids是按顺序分配的,请取该id的最大值而不是日期。
使用Oracle的分析功能,可以使用其他解决方案。
答案 2 :(得分:0)
尝试以下方法:
SELECT *
FROM
(SELECT e.emp_id,
e.name,
e.email,
e.title,
e.region,
e.division,
e.effective_date,
row_number() over (partition BY e.emp_id
ORDER BY e.effective_date DESC) rn
FROM employee e
UNION ALL
SELECT eh.emp_id,
eh.name,
eh.email,
eh.title,
eh.region,
eh.division,
eh.effective_date,
row_number() over (partition BY eh.emp_id
ORDER BY eh.effective_date DESC) rn
FROM employee_history eh)
WHERE effective_date < to_date('15/06/2012','DD/MM/YYYY')
AND rn = 1
您可以看到更好的示例here