Обновление большого количества записей в Oracle

Я новичок в sql. Может ли кто-нибудь помочь мне с этим требованием.

У меня есть таблица с 10000 записей, как это

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

И у меня есть другой список идентификаторов компаний, которые я собираюсь обновить приведенную выше таблицу (это просто таблица Excel, а не таблица)

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

Мое требование: если я нашел companyID в первой таблице, мне нужно обновить его с помощью NewID, и если я не нашел companyId в первой таблице, я должен создать новую строку в таблице с NewID независимо от oldID,

Есть ли возможность сделать как обновление, так и вставку в один запрос?

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 - это должно быть уникальным, чтобы делать то, что вы хотите, поэтому я не думаю, что это необоснованное предположение.

Другие вопросы по тегам