执行此更新的正确方法是这样的:
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 <> '--'
答案 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。