Значение SQL Update другими значениями той же таблицы - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть таблица, в которой у меня есть 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();

1 Ответ

0 голосов
/ 26 апреля 2018

Вы можете превратить ваш запрос в производную таблицу или CTE и присоединиться к нему в ОБНОВЛЕНИИ:

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}

Это psuedocode, очевидно: вам нужно заменить детали в фигурных скобках фактическими значениями, которые они описывают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...