如何为另一个表中的每一行向表中插入多行

时间:2017-09-22 21:09:41

标签: sql

我有两张桌子:TB1和TB2。

对于TB1的每一行,我想使用TB1中的一些值将N行数插入TB2。我该怎么做?

例如:

For each row in TB1
{
   For N in 1-10
   {
     insert into TB2 (col1, col2, col3, col4)
     values (N, TB1.Col1, 'Good job', TB1.Col2)
   }
   commit;
 }

3 个答案:

答案 0 :(得分:0)

使用您要使用的N个数字创建另一个表(永久或临时),然后将此列表与TB1交叉加入。如果该表名为n_list且名为N的列,则:

insert into TB2
    (col2, col2, col3, col4)
select
    N,
    TB1.Col1,
    'Good job',
    TB1.Col2
from
    TB1
    cross join n_list;

答案 1 :(得分:0)

您可以使用cross join。设置一个数字表,然后:

with n as (
      select 1 as n union all select 2 . . . union all select 10
     )
insert into tb2 (col1, col2, col3, col4)
     select n.n, TB1.Col1, 'Good job', TB1.Col2
     from tb1 cross join
          n;

有些注意事项:

  • 创建n的语法因数据库而异。例如,MySQL不支持CTE,因此它需要是一个子查询。 Oracle需要from dual,依此类推。
  • 要将行从一个表插入另一个表,您需要insert . . . select,而不是每行insert . . . values

最后,通用SQL方法在tb1上使用了10次传递:

insert into tb2 (col1, col2, col3, col4)
     select 1, TB1.Col1, 'Good job', TB1.Col2
     from tb1 
     union all
     select 2, TB1.Col1, 'Good job', TB1.Col2
     from tb1 
     union all
     . . .
     select 10, TB1.Col1, 'Good job', TB1.Col2
     from tb1 ;

答案 2 :(得分:0)

在等待建议的时候,我决定四处寻找并最终使用光标和for循环,这对我有用......但不确定它有多充足。并感谢所有的建议。

DECLARE
CURSOR myCursor IS 
    select col1, col2 from TB1;
tmp_rec myCursor%rowtype;
BEGIN
FOR tmp_rec in myCursor
  LOOP
    FOR N IN 1 .. 10
      LOOP
        insert into TB2 (col1, col2, col3, col4)
        values (N, TB1.col1, 'Good job', TB1.col2);
    END LOOP;
    COMMIT;
  END LOOP;
END;