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

2 番目の SQL Server は標準 SQL ではなく、結合された複数の行が 1 つの行に一致する可能性がある場合、不確定な結果を引き起こす可能性があると仮定しますcodesEntered

相関サブクエリ バージョンは、そのイベントでエラーを発生させます。また、まったく一致しなかった場合にも設定countrycodeされます。NULL

結合の方が効率的かもしれません。

MERGE少なくとも SQL Server 2008 を使用している場合は、独自の構文ではなく参照することもでき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 <> '--' )

このアプローチは、Oracle などの他の DMBS でも機能します。

于 2012-06-28T09:10:17.713 に答える