我有一张表,其中我有FK到其他表和此表中每条记录的时间戳。例如:
ID FK Timestamp
1 1 2015-05-05
2 1 2015-05-06
3 1 2015-05-07
4 2 2015-04-08
5 2 2015-04-09
6 2 2020-04-10 <- this timestamp should be set to timestamp of 5. row
7 2 2015-04-12
8 3 2015-05-06
问题是我得到的一些时间戳包含来自未来的值,应该将其设置回正常的时间戳。例如,在此步骤之前的那个,在同一个FK上。
我有一个查询,从未来选择所有记录,并获得他们的最大时间戳(在未来之前):
select ws1.Id, ws1.Timestamp, ws1.workitem_id,
(select max(Timestamp) from WorkSteps where WorkSteps.WorkItem_Id = ws1.WorkItem_Id AND Timestamp<GETDATE() AND worksteps.Id<ws1.id)
from worksteps ws1
where ws1.Timestamp > GETDATE()
order by WorkItem_Id;
如何将其转换为更新?
更新
好的,我想我明白了:
update worksteps set Timestamp =
(select max(Timestamp) from WorkSteps ws1 where ws1.WorkItem_Id = worksteps.WorkItem_Id AND Timestamp<GETDATE() AND ws1.Id<worksteps.id)
where worksteps.Timestamp > GETDATE();
答案 0 :(得分:1)
您可以查询派生表或CTE并在UPDATE:
中加入它UPDATE t
SET TimeStamp=q.{The Alias you need to provide for your sub-select}
FROM worksteps t
INNER JOIN (Your Query) q
ON t.{ThePrimaryKey}=q.{ThePrimaryKey}
这显然是伪代码:你需要用大括号替换它们描述的实际值。