更新oracle

时间:2015-09-09 10:18:07

标签: sql oracle bulkupdate

我是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如何。

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

1 个答案:

答案 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 )

如果newidoldid可能相同,那么您将遇到问题。这也假设您的新表在oldid newid上是唯一的 - 它必须是唯一的,以便做您想要的,所以我不认为这是一个不合理的假设。