0

这是进行此更新的正确方法,是这样吗:

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 <> '--' 
4

2 回答 2

1

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

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

连接可能更有效。

如果您至少在 SQL Server 2008 上,您还可以查看MERGE而不是专有UPDATE ... FROM语法。如果尝试多次更新同一行,这将引发错误。

于 2012-06-28T07:32:56.740 回答
0

你可以像这样尝试 st (我更喜欢的方式):

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 <> '--' )

这种方法也适用于其他 DMBS,如 oracle。

于 2012-06-28T09:10:17.713 回答