嗨,我在处理一个特定的 SQL 查询时遇到问题,问题如下:我有两个表,其中一个包含当前在一个产品中的项目,第二个是更改历史记录。每次编辑一个项目时,他的先前状态都会保存在历史表中,并且更改的时间和日期写入项目表的 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)))