-1

我是 sql 新手。有人可以帮我解决这个要求。

我有这样的 10000 条记录的表

CompanyID         Name 
300001            A
300004            B
300005            C
300007            D
|
|
|
310000            XXX

我还有另一个要更新上表的 companyID 列表(它只是一个 excel 表而不是表)

OldID       NewID
300001      500001
300002      500002
300003      500003
300004      500004
300005      500005
|
|
310000      510000

我的要求是,如果我在第一个表中找到 companyID,我需要用 NewID 更新它,如果我在第一个表中没有找到 companyId,我必须在表中用 NewID 创建一个新行,不管 oldID .

是否有可能在单个查询中同时进行更新和插入?

4

1 回答 1

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 )

如果 anewid和 anoldid可能相同,那么您将遇到问题。这也假设您的新表是唯一的,oldid 并且 newid- 它必须是唯一的才能执行您想要的操作,所以我认为这不是一个不合理的假设。

于 2015-09-09T10:49:59.757 回答