1

私はemployeeテーブルとemployee_historyテーブルを持っています。従業員テーブルを更新するたびに、employee_historyテーブルにレコードを挿入します。

両方のテーブルには、発効日と呼ばれる列があり、その発効日の従業員のステータスを示します。

以下は私の2つのテーブルです。

ここに画像の説明を入力してください

その発効日の最新の従業員記録を取得する必要があります。

たとえば、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 の最大値を取ります。

オラクルの分析関数を使用したソリューションの別の定式化があります。

于 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 に答える