使用每一行作为 Insert Into 循环遍历表的行 - SQL
Posted
技术标签:
【中文标题】使用每一行作为 Insert Into 循环遍历表的行 - SQL【英文标题】:Looping through rows of a table using each row as Insert Into - SQL 【发布时间】:2019-10-28 13:39:49 【问题描述】:我有一个叫做Reviews的表,我觉得这个问题的内容并没有太大的问题,但是我想把这个表的每一行,一个一个地浏览一遍,用每一行的数据作为Insert Into 语句的一部分。作为所使用的每一行的一部分,我需要将一个整数(称为 Evid)递增 1,因为该整数需要用作 Insert Into 语句的一部分。所以第一行将有 1,第二行将有 2,依此类推。
我正在使用 Advantage Architect,下面是我对其工作方式的大致了解,我知道我需要帮助。
我想用来循环的表格的行示例:
IDENT|REFERENCE|TITLE
1234 | TEST | testing
4456 | TEST2 | testing2
我想插入另一个表,它看起来像这样。它从上面遍历的每一行都将用于在下表中插入多行,但将 EVID 保持为连续的 INTEGER 值。
IDENT|REFERENCE|TITLE |STAFF |EVID
1234 | TEST | testing |STAFF1| 1
1234 | TEST | testing |STAFF2| 1
4456 | TEST2 | testing2|STAFF1| 2
4456 | TEST2 | testing2|STAFF2| 2
_
declare evid integer;
declare cur cursor;
evid = 1;
open cur
//Do Insert Into
//Evid +1;
Close cur;
【问题讨论】:
请编辑您的问题,向我们展示样本数据和预期结果。事实上,您的问题太宽泛了(并且很可能不需要循环:insert ... select ..
查询可能会更有效地完成工作)。
好的,我会编辑最初的问题
此操作不需要光标。
啊,好的@GordonLinoff。如果我可以问,您会建议什么作为可行的替代方案?
【参考方案1】:
使用游标的相关信息可以在online help找到
针对您的问题修改示例代码:
DECLARE @evid Integer;
DECLARE cur CURSOR;
OPEN cur As SELECT * FROM sourceTable;
@evid = 1;
WHILE FETCH cur DO
INSERT INTO destination (IDENT, REFERENCE, TITLE, STAFF, EVID)
VALUES (cur.IDENT, cur.REFERENCE, cur.TITLE, 'STAFF1', @evid);
INSERT INTO destination (IDENT, REFERENCE, TITLE, STAFF, EVID)
VALUES (cur.IDENT, cur.REFERENCE, cur.TITLE, 'STAFF2', @evid);
@evid = @evid + 1;
END WHILE;
CLOSE cursor1;
【讨论】:
以上是关于使用每一行作为 Insert Into 循环遍历表的行 - SQL的主要内容,如果未能解决你的问题,请参考以下文章
Oracle中insert into select和select into的区别