いくつかのT-SQLの助けをいただければ幸いです。
次の4つのテーブルがあります。
- アイテム(Id)
- ItemVersion(Id、FK多対1 Item.Id)
- ItemVersionStatusLog(LogDate、FK多対1 ItemVersion.Id、FK多対1 StatusType.Id)
- StatusType(Id、Alias)
この質問に適切な列のみをリストしました。
ルートエンティティはItem
です。それぞれに対してItem
、1つ以上のItemVersion
エントリがあります。エントリごとに、日付とへの参照(作成、更新、無効化など)を含むItemVersion
1つ以上のエントリがあります。ItemVersionStatusLog
StatusType
Item
新しいテーブル()に集計ビューを作成して、それぞれの「最新のステータス」を要約します。このビューItemStatus
を埋め戻し、データが変更されたときに更新し続けます。StatusType
集計により、アイテムとペアごとに、ログテーブルの最大日付のエントリが得られます 。それぞれのスナップショットを取得できるように、アイテムのStatusType
最新のものを取得できます。ItemVersion
それを置く別の方法は手続き的です:
For each Item
- For each StatusType
- - List the ItemVersion Id with the maximum date from ItemVersionStatusLog given the correct StatusType
集計ビューまたはテーブルのターゲット列は次のとおりです。
Item Id, ItemVersion Id, Date (from ItemVersionStatus), StatusType Id
UDFを使用すればこれをかなりうまく行うことができますが、可能であれば、単一のSQLステートメントでこれを実行したいと思います。私の主なターゲットはSQLServer2008ですが、SQL Server Compact 4もあまり変更されていないため、UDFに依存することは良い選択肢ではありませんが、助けていただければ幸いです:)
更新-いくつかのサンプルデータ
Item:
Id
--
1
2
ItemVersion:
Id | ItemId | Name
----------
1 | 1 | Apple
2 | 1 | Orange
3 | 1 | Plum
4 | 2 | Petrol
5 | 2 | Diesel
6 | 2 | LPG
StatusType:
Id | Alias
-----------
1 | Created
2 | Approved
3 | Published
4 | Deleted
ItemVersionStatusLog:
Id | ItemVersionId | StatusTypeId | Date
------------------------------------------
1 | 1 | 1 | 2012-01-01 00:00
2 | 1 | 4 | 2012-01-01 00:05
3 | 2 | 1 | 2012-01-01 00:10
4 | 2 | 3 | 2012-01-01 00:15
5 | 3 | 1 | 2012-01-01 00:20
6 | 3 | 3 | 2012-01-01 00:25
この場合、アイテム1の期待される結果は次のようになります。
ItemStatus
ItemId | ItemVersionId | Date | StatusTypeId
--------------------------------------------------------
1 | 3 | 2012-01-01 00:20 | 1
1 | 3 | 2012-01-01 00:25 | 3
1 | 1 | 2012-01-01 00:05 | 4