使用每一行作为 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的主要内容,如果未能解决你的问题,请参考以下文章

sql 循环查询

Oracle中insert into select和select into的区别

sql [INSERT INTO VALUES]将内容(一行)添加到现有的表#SQL中

外循环遍历每一行,嵌套循环遍历每个字符

MySql insert into 失败?

insert into 插入数据问题