Sql 使用查找表更新语句

Sql 使用查找表更新语句,sql,sql-update,Sql,Sql Update,我有一个SQL表Customer,包含以下列: Customer_ID, Actioncode 我还有一张表,上面有1000多个动作码。现在我想用actioncode表中的唯一代码更新Customer表中的记录 我现在使用这个select语句: update t set t.actiecode = (select top 1 actiecode from data_mgl_campagnemails_codes) from data_mgl_campagnemails_transfer t;

我有一个SQL表
Customer
,包含以下列:

Customer_ID, Actioncode
我还有一张表,上面有1000多个动作码。现在我想用
actioncode
表中的唯一代码更新
Customer
表中的记录

我现在使用这个select语句:

update t 
set t.actiecode = (select top 1 actiecode from data_mgl_campagnemails_codes)
from data_mgl_campagnemails_transfer t;
结果是所有记录都使用相同的
actiecode
更新。
top 1
负责这一点。当我删除时,我得到了一个错误:

子查询返回了多个值

这似乎合乎逻辑。如何在不使用光标的情况下执行此操作

Customer
code
表之间没有关系

表结构:

data_mgl_campagnemails_transfer
id  customer_id  actioncode  actioncode_id
1   1                 -           -
2   3                 -           -
3   4                 -           -

data_mgl_campagnemails_codes
id  actioncode active
1     TTTT   
2     RRRR
3     VVVV
4     RRRW
结果应该是:

data_mgl_campagnemails_transfer
id  customer_id  actioncode  actioncode_id
1   1               TTTT           1
2   3               RRRR           2
3   4               VVVV           3

data_mgl_campagnemails_codes
id  actioncode active
1     TTTT       YES
2     RRRR       YES
3     VVVV       YES
4     RRRW

使用一条语句可能有点棘手,因为SQL Server喜欢优化内容。所以显而易见的是:

update t 
    set t.actiecode = (select top 1 actiecode 
                       from data_mgl_campagnemails_codes
                       order by newid()
                      )
    from data_mgl_campagnemails_transfer t;
也不起作用。一种方法是枚举事物并使用
联接
或相关子查询:

with t as (
      select t.*, row_number() over (order by newid()) as seqnum
      from data_mgl_campagnemails_transfer t
     ),
     a as (
      select a.*, row_number() over (order by newid()) as seqnum
      from data_mgl_campagnemails_codes a
     )
update t
    set t.actiecode = (select top 1 actiecode from a)
    from t join
         a
         on t.seqnum = a.seqnum;
另一种方法是“欺骗”SQLServer多次运行相关子查询。我是这样想的:

update t 
    set t.actiecode = (select top 1 actiecode 
                       from data_mgl_campagnemails_codes
                       where t.CustomerId is not null -- references the outer table but really does nothing
                       order by newid()
                      )
    from data_mgl_campagnemails_transfer t;

如果两个表不相关,您如何确定应该为customer表中的每一行设置什么操作代码?另外,您使用的是什么?@Mureinik,我使用的是SQL表。@jpw。data_mgl_Campagne_codes选项卡中未使用的任何代码都可以。更新此表后,我想更新data_mgl_campagnemails表,并标记正在使用的所有代码。Tnx供您参考。我尝试了第二种方法,但我在每一条记录上都得到了相同的操作代码。第三种方法非常有效!Tnx!此解决方案是否存在性能问题?@Hodia。所有这些都不是真正有效的,但对于较小的数据,它们应该是好的。Tnx适合您的解决方案!