我是sql的新手。有人可以帮我解决这个问题。
我有这样的10000条记录的表
CompanyID Name
300001 A
300004 B
300005 C
300007 D
|
|
|
310000 XXX
我还有另一个公司ID列表,我将更新上表(它只是一张excel表而不是表格)
OldID NewID
300001 500001
300002 500002
300003 500003
300004 500004
300005 500005
|
|
310000 510000
我的要求是,如果我在第一个表中找到了companyID,我需要使用NewID更新它,如果我在第一个表中找不到companyId,我必须在表中创建一个新行NewID,无论oldID如何。
是否有可能在单个查询中同时进行更新和插入?
答案 0 :(得分:1)
您正在描述“upsert”或MERGE语句,通常为:
merge into table_a
using (<some_statement>)
on (<some_condition>)
when matched then
update
set ...
when not matched then
insert (<column_list>)
values (<column_list>);
但是,MERGE无法更新ON子句中引用的值,这是执行您所要求的操作所需的值。因此,您需要两个陈述:
update table_to_be_updated t
set companyid = (select newid from new_table where oldid = t.companyid )
insert into table_to_be_updated
select newid
from newtable t
where not exists ( select 1
from table_to_be_updated
where t.newid = companyid )
如果newid
和oldid
可能相同,那么您将遇到问题。这也假设您的新表在oldid
和 newid
上是唯一的 - 它必须是唯一的,以便做您想要的,所以我不认为这是一个不合理的假设。