Сначала заполните свой список ОЗУ во временной таблице TMP
select * from tmp;
VALUE1
----------
V00000001
V00000002
V00000003
V00000004
V00000005
...
Вы можете использовать оператор MERGE
для обработки вашего логика
- , если ключ существует, увеличитьсчитать на 1
- , если ключ не существует, вставить его с начальным счетом 1
.
merge into val
using tmp
on (val.value1 = tmp.value1)
when matched then update
set val.count = val.count + 1
when not matched then
insert (val.value1, val.count)
values (tmp.value1, 1)
;
Обратите внимание, что у вас есть IDENTITY
введите в столбце ID
, поэтому назначение ключа не требуется.
В случае дублирования записи в таблице TMP
(больше записей с одинаковым ключом VALUE1
) вы получаете ошибку, поскольку MERGE
не может выполнять больше действий одним ключом.
ORA-30926: unable to get a stable set of rows in the source tables
Если вы хотите считать каждый дублированный ключ как один - вы должны предварительно агрегировать временную таблицу, используя GROUP BY
идобавьте counts
.
В противном случае просто игнорируйте дубликаты, используя DISTINCT
.
merge /*+ PARALLEL(5) */ into val
using (select value1, count(*) count from tmp group by value1) tmp
on (val.value1 = tmp.value1)
when matched then update
set val.count = val.count + 1
when not matched then
insert (val.value1, val.count)
values (tmp.value1, 1)