Oracle / несколько вставок без циклов - PullRequest
1 голос
/ 10 марта 2020

У меня есть следующая таблица table_1, которая содержит тысячи строк:

Num_replication   object_name
--------------------------------
       4             obj_1
       8             obj_2
      12             obj_3

для каждой из этих строк, мне нужно вставить строки в другие таблицы.

Например, Мне нужно вставить одну строку в table_2 для каждой строки в table_1:

ID       obj_name
------------------
1         obj_1
2         obj_2
3         obj_3

, а в table_3 мне нужно вставить количество строк на основе num_replication следующим образом:

ID       port
--------------
1        P0001
1        P0002
1        P0003
1        P0004
2        P0001
2        P0002
2        P0003
2        P0004
2        P0005
2        P0006
2        P0007
2        P0008

и то же самое для других строк.

Я знаю, что могу выполнить sh это с помощью циклов, но мне нужно делать это без циклов, используя несколько вставок.

любая помощь будет принята.

1 Ответ

4 голосов
/ 10 марта 2020

Используйте иерархический запрос для умножения строк и затем условного insert all, с dense_rank генерирующим идентификатором:

insert all
  when column_value = 1 then
    into table_2(id, obj_name) values (rn, object_name) 
  when 1 = 1 then
    into table_3(id, port) values(rn, port)
select dense_rank() over (order by object_name) rn, t.object_name, 
       column_value, 'P'||lpad(column_value, 4, '0') port
  from table_1 t, 
  table(cast(multiset(select level 
                        from dual 
                        connect by level <= t.num_replication) 
             as sys.odcinumberlist));

Демо-версия dbfiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...