带连接的sql更新

时间:2012-06-28 07:29:31

标签: sql sql-server

执行此更新的正确方法是这样的:

UPDATE [log].codesEntered
SET    [log].codesEntered.countrycode = 
             (SELECT [user].[profile].countryCode
             FROM   [user].[profile]
                    INNER JOIN [log].codesEntered
                      ON [log].codesEntered.userid = [user].[profile].userid
             WHERE  [log].codesEntered.countryCode <> [user].[profile].countryCode
                    AND [log].codesEntered.campid = @campid
                    AND [log].codesEntered.portalid = @portalid
                    AND [user].[profile].countryCode <> ''
                    AND [user].[profile].countryCode <> '--') 

或者这样:

UPDATE [log].codesEntered
SET    [log].codesEntered.countrycode = [user].[profile].countryCode
FROM   [log].codesEntered
       INNER JOIN [user].[profile]
         ON [log].codesEntered.userid = [user].[profile].userid
WHERE  [log].codesEntered.countryCode <> [user].[profile].countryCode
       AND [log].codesEntered.campid = @campid
       AND [log].codesEntered.portalid = @portalid
       AND [user].[profile].countryCode <> ''
       AND [user].[profile].countryCode <> '--' 

2 个答案:

答案 0 :(得分:1)

假设SQL Server第二个不是标准SQL,并且在多个连接行可以匹配codesEntered行的情况下可能导致不确定结果。

相关的子查询版本会在该事件中引发错误。如果根本没有匹配,它还会将countrycode设置为NULL

加入可能更有效率。

如果您至少使用SQL Server 2008,也可以查看MERGE而不是专有的UPDATE ... FROM语法。如果尝试更新同一行,则会引发错误一次。

答案 1 :(得分:0)

你可以试试这样的(我喜欢的方式):

UPDATE [log].codesEntered log
SET    [log].codesEntered.countrycode =  (select countryCode from [user].[profile]   where [user].[profile].userid = log.userid)
WHERE  log.userid in 
       ( select [log].codesEntered.userid
       from [log].codesEntered join [user].[profile]
        on [log].codesEntered.userid = [user].[profile].userid
       where [log].codesEntered.countryCode <> [user].[profile].countryCode
       AND [log].codesEntered.campid = @campid
       AND [log].codesEntered.portalid = @portalid
       AND [user].[profile].countryCode <> ''
       AND [user].[profile].countryCode <> '--' )

这种方法也适用于像oracle这样的其他DBMS。