マスタテーブルと他のテーブルのフィールドが変更されるかどうかを記録する履歴テーブルを持つことにより、ポイントインタイム情報を取得しようとするデータベースがあります。例えば対応する値が他のテーブルに存在しない場合のSQL選択値
表:社員
Id | Name | Department
-----------------------------
0 | Alice | 1
1 | Bob | 1
表:歴史、その従業員0(アリス)を記録
ChangeDate | Field | RowId | NewValue
---------------------------------------------
05/05/2009 | Department | 0 | 2
は2009年5月5日に部門2に移動します。
特定の日付に従業員の部門を特定するためのクエリを作成したいと考えています。だから、する必要があります:
- は何も存在しない場合、マスター従業員表に、現在値がデフォルトに指定された日付
- 前に最初の歴史のそのフィールドのレコードと従業員を探します。
どうすればいいですか?私の直観は、適切な履歴レコードがすべて日付順とマスタテーブルの最後にある結果セットの最初の行を選択することです(適切な履歴レコードがない場合は最初の結果になります)。しかし、これを実現するために必要なSQL-fuがあります。
注:私は、これがこのシステムを実装するための最良の方法ではないかもしれないことを意識しています - 私は、短期的にはこれを変更することはできないです - あなたはこの私を実装するためのより良い方法を提案することができるかどうもののそれを聞いてうれしいです。両方Oracle
とMS SQL
で
あなたはどのようなRDBMSを使用していますか? – Quassnoi
ほとんどMSSQLですが、Oracleもサポートしていますので、可能な限り一般的なものにする必要があります。 –