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