为Oracle插入LOOP

时间:2018-06-13 13:44:45

标签: sql oracle loops sql-insert

我需要一个mi问题的解决方案。它不一定是一个循环,我感谢每一个输入。

我有一个包含262个条目的表。我们称之为 EXPTB1 。 我有第二个表 EXPTB2 ,这是emtpy。

现在对于EXPTB1中的每个条目,我需要在EXPTB2中有6个条目。必须填写三个属性。一个是主键,它由序列自动生成。一个是EXPTB1条目的外键,一个包含6个条目中每个条目的六个不同数字(位置)。数字总是1,2,3,11,12,13。

所以我看一下每个ist对象需要的EXPTB1的单个条目以下查询:

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);

Image of Result

  1. ROWNUMBER
  2. 主键 - 按顺序创建
  3. EXPTB1条目中的外键
  4. 位置
  5. 我希望我的描述足够清楚,描述起来有点困难.. :)

    干杯 费边

2 个答案:

答案 0 :(得分:2)

试试这个:

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个新行。

答案 1 :(得分:2)

您可以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;