こんにちは、ある特定の SQL クエリで問題が発生しています。問題は次のようになります。2 つのテーブルがあり、1 つには現在 1 つの製品内にある項目があり、2 つ目は変更履歴です。1 つのアイテムが編集されるたびに、その前の状態が履歴テーブルに保存され、変更された日時がアイテム テーブルの item_edited 列に書き込まれます。アイテムが削除された場合、アイテム テーブルから削除され、アイテムの最後の状態で新しい行が履歴テーブルに挿入され、削除日が履歴テーブルの item_deleted 列に書き込まれます。アイテムが編集されていない場合、item_edited の値は NULL になり、アイテムが削除されていない場合、item_deleted の値は NULL になります。
特定の日付に製品の状態を返す SQL クエリを作成する必要があります (アイテムとその日付にあった番号)
テーブル
アイテム
product_Id (uniqueidentifier,null)
item_Id (PK,bigint,not null)
item_name (varchar(200),not null)
item_number_of_items (int,null)
item_created (datetime,null)
item_created_by_person (uniqueidentifier,null)
item_edited (datetime,null)
item_edited_by_person (uniqueidentifier,null)
歴史
history_Id (PK,bigint,not null)
product_Id (uniqueidentifier,null)
item_Id (PK,bigint,not null)
item_name (varchar(200),not null)
item_number_of_items (int,null)
item_created (datetime,null)
item_created_by_person (uniqueidentifier,null)
item_edited (datetime,null)
item_edited_by_person (uniqueidentifier,null)
item_deleted (datetime,null)
これは私が今持っているものです。問題は、履歴から重複したアイテムを取得することです。たとえば、特定のアイテムの履歴に「編集」状態がさらにある場合、このクエリは選択した日付より前のすべての状態を返すため、重複したアイテムを取得します最終結果で。そして、選択した日付の前に最後に編集され、選択した日付の前に削除されておらず、アイテムテーブルにないアイテムのみを履歴から選択する条件が必要です。
DECLARE @selectDate DATETIME
SET @selectDate = '2013/05/9'
DECLARE @Product_Id UNIQUEIDENTIFIER
SET @Product_Id = 'AF4A8D96-2B9B-4C09-8FA3-C6BE20CFD391'
SELECT item_Id,
item_name,
item_number_of_items,
item_created,
item_created_by_person,
item_edited,
item_edited_by_person
FROM Items WHERE product_Id=@Product_Id
AND FLOOR(CAST (ISNULL(item_edited,item_created) AS FLOAT)) <= FLOOR(CAST(@selectDate AS FLOAT))
UNION ALL
SELECT item_Id,
item_name,
item_number_of_items,
item_created,
item_created_by_person,
item_edited,
item_edited_by_person
FROM History
WHERE product_Id=@Product_Id
AND FLOOR(CAST (ISNULL(item_edited,item_created) AS FLOAT)) <= FLOOR(CAST(@selectDate AS FLOAT))
AND (FLOOR(CAST(item_deleted AS FLOAT)) > FLOOR(CAST(@selectDate AS FLOAT)) OR item_deleted IS NULL)
AND item_Id NOT IN (SELECT item_Id FROM item WHERE product_Id=@Product_Id
AND FLOOR(CAST (ISNULL(item_edited,item_created) AS FLOAT)) <= FLOOR(CAST(@selectDate AS FLOAT)))