1

我有一个employee 和employee_history 表。对于employee 表的每次更新,我都会在employee_history 表中插入一条记录。

这两个表都有一个名为“生效日期”的列,表示员工在该生效日期的状态。

下面是我的两张表。

在此处输入图像描述

我需要在该生效日期获得最新的员工记录。

例如,如果我需要在 16 日获得员工,我应该从历史表中获得 emp_hist_id = 2 记录。在 6 月 5 日,我应该从 hist 表中获取 emp_hist_id = 4 。

并且在 8 月 15 日,我应该从员工表本身获取记录。

请帮忙。

4

3 回答 3

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

这个想法是从两个表中获取与所需用户相关的记录,然后获取低于所需用户的日期,最后捕获第一个

于 2012-05-21T13:04:05.810 回答
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 的分析函数可以使用其他解决方案。

于 2012-05-21T13:09:22.110 回答
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

你可以在这里看到一个更好的例子

于 2012-05-21T13:49:57.120 回答