【问题标题】:Replace multiple fields with one query用一个查询替换多个字段
【发布时间】:2014-10-30 18:33:41
【问题描述】:

除了运行两个单独的查询来替换我的 parts 表中的 innerSkuouterSku 字段,有没有办法在一个查询中执行此操作而不影响性能?

UPDATE 
    parts
SET 
    innerSku = @newSku
WHERE
    innerSku = @oldSku;


UPDATE
    parts
SET
    outerSku = @newSku
WHERE
    outerSku = @oldSku;

【问题讨论】:

    标签: sql sql-server replace sql-update


    【解决方案1】:

    我会坚持使用两个单独的语句,因为使用以下语句会更新一些不需要更新的行,它会将行更新到自身,这不会更改数据但会发生不必要的更新操作,我会说坚持两个更新。无论如何,以下是如何使用一个更新语句更新此表。

    UPDATE Parts 
      SET innerSku = CASE 
                          WHEN innerSku = @oldSku 
                          THEN @newSku ELSE innerSku 
                     END
         ,outerSku = CASE 
                          WHEN outerSku = @oldSku 
                          THEN @newSku ELSE outerSku 
                     END
     WHERE innerSku = @oldSku OR outerSku = @oldSku
    

    【讨论】:

    • 根据表的索引方式,您可能会添加大量索引更新以及锁定范围或表的额外时间。此外,这两个简单的语句更具可读性(和可测试性)。
    • True @Rawheiser 同意 100%
    【解决方案2】:

    case 语句成为你的 where 条件决定设置什么值,只更新满足条件的列,否则只会设置当前值。

    where 子句使您不必在整个表上运行该语句。

    SET parts.innerSku = (CASE WHEN innerSku = @oldSku THEN @newSku ELSE innerSku END),
        parts.outerSku = (CASE WHEN outerSku = @oldSku THEN @newSku ELSE outerSku END)
    WHERE parts.innerSku = @oldSku or parts.outerSku = @oldSku
    

    【讨论】:

    • +1 提供了一个很好的答案。我选择了另一个答案作为公认的解决方案,因为它概述了使用这种方法的缺点。
    猜你喜欢
    • 2018-02-16
    • 2014-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-12
    • 2022-06-10
    相关资源
    最近更新 更多