我正在尝试为具有以下结构的表编写一个简单的“undo”系统:
id element position start_date end_date
1 1 23 01/01/2015 05/01/2015
2 2 36 01/01/2015 NULL
3 1 17 05/01/2015 NULL
因此,当为现有元素添加新操作时,它会添加一个包含新位置和当前日期的新行,并将该元素前一行的end_date更改为当前日期。
现在,为了撤消这个,我删除了没有定义end_date的元素行(这是该元素的最新动作),但是我必须将前一行的end_date更改为{{1} }。
因此,在伪语言中,所需的查询将是:
null
问题:要键入什么而不是UPDATE [table] SET end_date = NULL
WHERE element = 1
AND start_date = 'highest_start_date_to_be_found_of_this_element'
才能使其正常工作?
答案 0 :(得分:3)
这应该为每个在元素中具有相同值的条目提供最新的start_date,就像update语句中定义的值一样。 所以你只需要在一个地方改变它。
UPDATE [table] t SET t.end_date = NULL WHERE t.element = 1 AND t.start_date = (select max(sub.start_date) from [table] sub where sub.element = t.element)
答案 1 :(得分:0)
您可以使用:
CREATE TABLE #temp(id int, start_date date)
INSERT INTO #temp(id, start_date)
VALUES(1,GETDATE()),(2,DATEADD(day,-1,GETDATE())),(1,DATEADD(day,+3,GETDATE()))
SELECT *
FROM #temp
-- your part
UPDATE t
SET start_date = m.maxDate
FROM #temp t
INNER JOIN (
SELECT id, MAX(start_date) as maxDate
FROM #temp
GROUP BY id
) m
ON t.id = m.id
SELECT *
FROM #temp
DROP TABLE #temp
答案 2 :(得分:0)
一种方法是使用带有TOP
和ORDER BY
的子查询:
update t
set end_date = NULL
from (select top 1 t.*
from table t
order by start_date desc
);
这将只更新一行。如果您希望所有行都具有最大开始日期,请在子查询中使用with ties
。