Вы должны быть в состоянии пропустить промежуточную таблицу;просто извлеките 1-й и 4-й элементы, используя функцию regexp_substr()
, проверяя, чтобы они не были нулевыми:
select regexp_substr(value, '(.*?)(;|$)', 1, 1, null, 1) -- first position
|| ';' || regexp_substr(value, '(.*?)(;|$)', 1, 4, null, 1) -- fourth position
|| ';' as value, -- if you want trailing semicolon
count
from source
where regexp_substr(value, '(.*?)(;|$)', 1, 1, null, 1) is not null
and regexp_substr(value, '(.*?)(;|$)', 1, 4, null, 1) is not null;
VALUE COUNT
------------------ ----------
A;D; 2
B;E; 1
A;D; 3
, а затем агрегируйте эти результаты:
select value, sum(count) as count
from (
select regexp_substr(value, '(.*?)(;|$)', 1, 1, null, 1) -- first position
|| ';' || regexp_substr(value, '(.*?)(;|$)', 1, 4, null, 1) -- fourth position
|| ';' as value, -- if you want trailing semicolon
count
from source
where regexp_substr(value, '(.*?)(;|$)', 1, 1, null, 1) is not null
and regexp_substr(value, '(.*?)(;|$)', 1, 4, null, 1) is not null
)
group by value;
VALUE COUNT
------------------ ----------
A;D; 5
B;E; 1
Тогда для вашей вставки вы можете использовать этот запрос, либо с идентификатором автоинкремента (12c +), либо с помощью установки идентификатора из последовательности с помощью триггера, либо, возможно, в другом уровне подзапроса, чтобы получить значение явно:
insert into target (id, value, count)
select some_seq.nextval, value, count
from (
select value, sum(count) as count
from (
select regexp_substr(value, '(.*?)(;|$)', 1, 1, null, 1) -- first position
|| ';' || regexp_substr(value, '(.*?)(;|$)', 1, 4, null, 1) -- fourth position
|| ';' as value, -- if you want trailing semicolon
count
from source
where regexp_substr(value, '(.*?)(;|$)', 1, 1, null, 1) is not null
and regexp_substr(value, '(.*?)(;|$)', 1, 4, null, 1) is not null
)
group by value
);
Если вы создаете для этого новую последовательность, поэтому они начинаются с 1, вы можете использовать rownum
или row_number()
.
Кстати, используяключевое слово или имя функции, например count
, поскольку имя столбца сбивает с толку (sum(count)
!?);это могут быть не ваши настоящие имена.