Sql 使用查找表更新语句
我有一个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;
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适合您的解决方案!