Как обновить на основе исходных значений в SQL - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь сделать очень простое обновление таблицы, где я хочу заменить одну строку другой в большой таблице.Я пытаюсь сделать это в пакетном режиме, потому что таблица содержит сотни миллионов строк.

Но мне нужно заменить строку по-разному в зависимости от того, что там было, но все же выполнить требование номера пакета всамая последняя отметка времени.

Я не хочу запускать 5 разных сценариев по отдельности.

Я дошел до этого момента, но не знаю, как правильно применить обновление в зависимости отчто там было изначально.

Есть идеи, как это сделать эффективно?

DECLARE @batchsize bigint = 1000;

WHILE 1 = 1
BEGIN
    UPDATE TOP (@batchsize) Table1
    SET Row1 = 'To1'  -- want to set To2, To3, To4, To5, etc. depending on what was in there already
    FROM (SELECT TOP (@batchsize) Id
    FROM Table1 
    ORDER BY TimeStamp DESC) tto
    WHERE Table1.Row1 in ('From1', 'From2', 'From3', 'From4', 'From5') AND Table1.Id = tto.Id;

    if @@ROWCOUNT < @batchsize
    BEGIN
        PRINT('All Done');
        BREAK;
    END;
END;

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Похоже, что это должно сделать это:

SET Row1 = CASE 
  WHEN Row1 = 'From1' THEN 'To1' 
  WHEN Row1 = 'From2' THEN 'To2' 
  etc
END
0 голосов
/ 13 февраля 2019

Вы просто ищете выражение case?

   UPDATE TOP (@batchsize) Table1
     SET Row1 = (CASE table1.Row1
                     WHEN 'From1' THEN 'To1'
                     WHEN 'From2' THEN 'To2'
                     WHEN 'From3' THEN 'To3'
                     WHEN 'From4' THEN 'To4'
                     WHEN 'From5' THEN 'To5'
                 END)
     FROM (SELECT TOP (@batchsize) Id
           FROM Table1 
           ORDER BY TimeStamp DESC
          ) tto
     WHERE Table1.Row1 in ('From1', 'From2', 'From3', 'From4', 'From5') AND
           Table1.Id = tto.Id;
...