将行复制到同一个表中,但更改一个字段的值

时间:2017-11-16 15:39:58

标签: tsql

我有一个值列表:

(56957,85697,56325,45698,21367,56397,14758,39656)

和表格中的“模板”行。

我想这样做:

for value in valuelist:
{
insert into table1 (field1, field2, field3, field4)
select value1, value2, value3, (value)
from table1
where ID = (ID of template row)
}

我知道如何在代码中执行此操作,例如c#,但我不确定如何在将新值传递给insert语句时“循环”这个。 (我知道代码没有意义,只是想传达我想要完成的事情。

1 个答案:

答案 0 :(得分:0)

这里不需要循环,SQL是一种基于集合的语言,您可以同时将操作应用于整个数据集,而不是逐行循环。

insert语句可以来自显式值列表,也可以来自常规select语句的结果,例如:

insert into table1(col1, col2)
select col3
      ,col4
from table2;

没有什么能阻止您select来自您insert的同一个地方的数据,这会复制您的所有数据:

insert into table1(col1, col2)
select col1
      ,col2
from table1;

如果要编辑其中一个列值 - 例如通过递增当前保存的值,只需将此逻辑应用于select语句,并确保结果数据集与列表中的目标表匹配,数据类型:

insert into table1(col1, col2)
select col1
      ,col2+1 as col2
from table1;

可选地,如果您只想对这些值的子集执行此操作,只需添加标准where子句:

insert into table1(col1, col2)
select col1
      ,col2+1 as col2
from table1
where col1 = <your value>;

现在,如果这不足以让您自己解决问题,您可以join数据集到您的值列表,以获取要insert的数据版本该列表中的每个值。由于您希望每行都加入到每个值,因此您可以使用cross join

declare @v table(value int);
insert into @v values(56957),(85697),(56325),(45698),(21367),(56397),(14758),(39656);

insert into table1(col1, col2, value)
select t.col1
      ,t.col2
      ,v.value
from table1 as t
    cross join @v as v