我有两张桌子: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;
}
答案 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;