【问题标题】:Bulk Record Update with SQL使用 SQL 批量更新记录
【发布时间】:2011-07-08 18:53:43
【问题描述】:

我在 SQL Server 2008 环境中有两个表,结构如下

Table1
- ID
- DescriptionID
- Description

Table2
- ID
- Description

Table1.DescriptionID 映射到 Table2.ID。但是,我不再需要它了。我想进行批量更新,将 Table1 的 Description 属性设置为 Table2 中与其关联的值。换句话说,我想做这样的事情:

UPDATE
  [Table1] 
SET
  [Description]=(SELECT [Description] FROM [Table2] t2 WHERE t2.[ID]=Table1.DescriptionID)

但是,我不确定这是否合适。有人可以告诉我怎么做吗?

【问题讨论】:

    标签: sql sql-server sql-update


    【解决方案1】:

    你的方法是正确的,下面是另一种方法:

    update      Table1
    set         Description = t2.Description
    from        Table1 t1
    inner join  Table2 t2
    on          t1.DescriptionID = t2.ID
    

    嵌套选择只是进行连接的漫长过程。

    【讨论】:

    • 我喜欢在 UPDATE 中使用别名。确实没有区别,但可以清楚地表明我实际上正在更新 FROM 中的哪个表。对自我连接等有用
    • @gbn:您不能为更新子句之后的表设置别名 (UPDATE thisTableCannotHaveAnAlias) ...
    • 你没有别名,你指的是你在 from 子句中指定的别名。就像我的回答和我的旧回答一样:stackoverflow.com/questions/982919/sql-update-query-using-joins/… 和 MSDN technet.microsoft.com/en-us/library/ms177523.aspx 在那里你可以UPDATE table_alias "table_alias: FROM 子句中指定的别名,表示要从中更新行的表或视图。 "
    【解决方案2】:

    你的方法没问题

    也许稍微清楚一点(反正对我来说!)

    UPDATE
      T1
    SET
      [Description] = t2.[Description]
    FROM
       Table1 T1
       JOIN
       [Table2] t2 ON t2.[ID] = t1.DescriptionID
    

    这和您的查询都应该在性能方面运行相同,因为它是相同的查询,只是布局不同。

    【讨论】:

    • +1 告诉他性能是一样的。不过,到目前为止,您的文章更容易阅读。
    【解决方案3】:

    您可以通过普通的UPDATEJOIN 来做到这一点

    UPDATE T1
    SET Description = T2.Description
       FROM Table1 T1
          JOIN Table2 T2
             ON T2.ID = T1.DescriptionId
    

    【讨论】:

    • 这看起来与 gbn 的答案一模一样,但@Tocco 说这个是错误的,另一个是正确的。什么给了?
    【解决方案4】:

    或者你可以简单地更新而不使用这样的连接:

    Update t1 set  t1.Description = t2.Description from @tbl2 t2,tbl1 t1
    where t1.ID= t2.ID
    

    【讨论】:

      【解决方案5】:

      您在问题中发布的 SQL 是一种方法。 SQL 中的大多数事情都有不止一种方法。

      UPDATE
        [Table1] 
      SET
        [Description]=(SELECT [Description] FROM [Table2] t2 WHERE t2.[ID]=Table1.DescriptionID)
      

      如果您打算在 PROD DB 上运行它,最好先创建它的快照或镜像并进行测试。验证数据最终是否符合您对几条记录的预期。如果您满意,请在真实数据库上运行它。

      【讨论】:

        猜你喜欢
        • 2021-11-21
        • 1970-01-01
        • 2023-03-05
        • 2021-12-13
        • 1970-01-01
        • 2017-11-13
        • 2018-09-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多