【问题标题】:Trying SQL table update matching on string field在字符串字段上尝试 SQL 表更新匹配
【发布时间】:2011-10-21 15:46:03
【问题描述】:

真的可以在更新查询方面使用一些帮助...(SQL Serer 2008 R2 Express) 我有两张桌子,tblJPtblMaster

我只有一个在两个表之间匹配的字符串字段。

tblJP AND tblMaster

我需要在何时将tblJP.LangString 更新为tblMaster.Long_text

tblJP.short_text = tblMaster.short_text AND tblMaster.Lang = 'jp'

任何帮助将不胜感激。我正在旋转我的轮子,尝试各种逻辑和语法,从创建临时表到其他类型的连接,都没有运气。

【问题讨论】:

    标签: sql sql-server-2008 sql-server-2008r2-express


    【解决方案1】:

    使用INNER JOIN 进行简单更新即可解决问题。

    UPDATE     tblJP
    SET        tblJP.LangString = tblMaster.Long_Text
    FROM       tblJP
    INNER JOIN tblMaster ON tblMaster.alt_text = tblJP.short_text
    WHERE      tblMaster.Lang = 'jp'
    

    警告:在没有先针对开发服务器进行测试之前,切勿针对您的生产服务器运行更新语句——尤其是当其他人编写 SQL 时。

    【讨论】:

    • +1 免责声明!如果连接中有多个匹配行,这可能会导致不确定的结果(merge 避免的问题)
    • 另外,关于 James 的警告:我喜欢以 BEGIN TRANSACTION 开始任何更新语句,并以 -- COMMIT 结束。然后我可以检查受影响的行数并选择和 F5 提交,如果它是我所期望的。 (虽然这并不能验证数据的变化...)
    【解决方案2】:

    你也可以使用MERGE

    MERGE INTO tblJP
    USING (SELECT *
           FROM   tblMaster
           WHERE  Lang = 'jp') AS SOURCE
    ON SOURCE.alt_text = tblJP.short_text
    WHEN MATCHED THEN
      UPDATE SET LangString = SOURCE.Long_Text;  
    

    如果JOIN 返回多行,您将收到错误The MERGE statement attempted to UPDATE or DELETE the same row more than once. 的问题警告

    【讨论】:

    • 感谢您发布此信息。我看到了您的评论,但我之前从未使用过MERGE,所以我不确定如何将其纳入我的答案中。
    猜你喜欢
    • 2019-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    • 2020-05-22
    相关资源
    最近更新 更多