Вставьте LOOP для Oracle - PullRequest
       15

Вставьте LOOP для Oracle

0 голосов
/ 13 июня 2018

Мне нужно решение проблемы mi.Это не обязательно должен быть цикл, я благодарен за каждый ввод.

У меня есть таблица с 262 записями.Давайте назовем это EXPTB1 .И у меня есть вторая Таблица EXPTB2 , которая является emtpy.

Теперь для каждой записи в EXPTB1 мне нужно 6 записей в EXPTB2.И три атрибута должны быть заполнены.Одним из них является первичный ключ, который автоматически генерируется последовательностью.Один - это внешний ключ записи EXPTB1, а другой содержит шесть разных номеров (позиций) для каждой из 6 записей.Числа всегда будут 1,2,3,11,12,13.

Итак, мы рассмотрим отдельную запись EXPTB1, которая мне нужна для каждого из объектов ist, следующего запроса:

insert into EXPTB2(EXPTB2_ID,EXPTB2_EXPTB1_ID,EXPTB2_POSITION) values (EXPTB2_SEQ.nextval,EXPTB1_ID,1);
insert into EXPTB2(EXPTB2_ID,EXPTB2_EXPTB1_ID,EXPTB2_POSITION) values (EXPTB2_SEQ.nextval,EXPTB1_ID,2);
insert into EXPTB2(EXPTB2_ID,EXPTB2_EXPTB1_ID,EXPTB2_POSITION) values (EXPTB2_SEQ.nextval,EXPTB1_ID,3);
insert into EXPTB2(EXPTB2_ID,EXPTB2_EXPTB1_ID,EXPTB2_POSITION) values (EXPTB2_SEQ.nextval,EXPTB1_ID,11);
insert into EXPTB2(EXPTB2_ID,EXPTB2_EXPTB1_ID,EXPTB2_POSITION) values (EXPTB2_SEQ.nextval,EXPTB1_ID,12);
insert into EXPTB2(EXPTB2_ID,EXPTB2_EXPTB1_ID,EXPTB2_POSITION) values (EXPTB2_SEQ.nextval,EXPTB1_ID,13);

Изображение результата

  1. Rownumber
  2. Первичный ключ - создается по последовательности
  3. Внешний ключ из записи в EXPTB1
  4. Позиция

Надеюсь, мое описание достаточно ясное, его немного сложно описать ..:)

Приветствия Фабиан

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Вы можете CROSS JOIN с выражением коллекции таблиц, содержащим значения:

INSERT INTO EXPTB2( EXPTB2_ID,EXPTB2_EXPTB1_ID,EXPTB2_POSITION )
SELECT EXPTB2_SEQ.nextval,
       EXPTB1_ID,
       t.COLUMN_VALUE
FROM   EXPTB1
       CROSS JOIN
       TABLE( SYS.ODCINUMBERLIST( 1, 2, 3, 11, 12, 13 ) ) t;
0 голосов
/ 13 июня 2018

Попробуйте это:

insert into EXPTB2 (EXPTB2_ID,EXPTB2_EXPTB1_ID,EXPTB2_POSITION)
with positions (pos) as
( select 1 from dual union all
  select 2 from dual union all
  select 3 from dual union all
  select 11 from dual union all
  select 12 from dual union all
  select 13 from dual )
select EXPTB2_SEQ.nextval, EXPTB1_ID, positions.pos
from   EXPTB1
       cross join positions;

Предложение with создает виртуальную таблицу POSITIONS с 6 строками, содержащими нужные значения.Затем он перекрестно соединяется с исходной таблицей для создания 6 новых строк для каждой строки исходной таблицы.

...