更新oracle中的批量记录

Update bulk number of records in oracle

我是 sql 的新手。谁能帮我解决这个问题。

我 table 有 10000 条这样的记录

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

我还有另一个公司 ID 列表,我将更新上面的 table(它只是 excel sheet 而不是 table)

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

我的要求是,如果我在第一个 table 中找到公司 ID,我需要用新 ID 更新它,如果我在第一个 table 中找不到公司 ID,我必须使用 NewID 在 table 中创建一个新行,而不考虑 oldID。

有没有可能在一个查询中同时进行更新和插入?

您描述的是 "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 可能相同,那么您 运行 就会遇到问题。这也假设你的新 table 在 oldid newid 上是唯一的 - 它必须是唯一的才能做你想做的事所以我不要认为这是一个不合理的假设。