【问题标题】:How to update based on original values in SQL如何根据 SQL 中的原始值进行更新
【发布时间】:2019-02-13 16:37:13
【问题描述】:

我正在尝试对表进行非常简单的更新,我想在一个大表中用一个字符串替换另一个字符串。我正在尝试分批进行,因为该表有数亿行。

但是我需要根据那里的内容不同地替换字符串,但仍然满足批号在最新时间戳中的要求。

我不想分别运行 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;

【问题讨论】:

  • 样本数据和期望的结果会有所帮助。
  • 有什么原因不能使用 CASE 表达式吗?
  • 您并没有真正详细地描述您的业务逻辑。你能告诉我们更多你的意思吗:I need to replace the string differently depending on what was there
  • 小心,如果新的更新值与之前的旧值重叠,那么它永远不会完成。如果没有,CASE 可以解决替换问题。

标签: sql sql-server performance sql-update


【解决方案1】:

似乎应该这样做:

SET Row1 = CASE 
  WHEN Row1 = 'From1' THEN 'To1' 
  WHEN Row1 = 'From2' THEN 'To2' 
  etc
END

【讨论】:

    【解决方案2】:

    您只是在寻找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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-16
      • 2012-01-17
      相关资源
      最近更新 更多