我有一个查询,如下所示 column1是int anothercolumn是varchar(100)
INSERT INTO TABLE1 (column1,column2)
SELECT (MAX(column1) FROM TABLE1)+1 ,anotherColumn FROM TABLE2
Table1查询前
column1 column2
------- -------
3 test1
4 test2
表1查询后
column1 column2
------- -------
3 test1
4 test2
5 anotherVal1
5 anotherVal2
5 anotherVal3
但我想要
column1 column2
------- -------
3 test1
4 test2
5 anotherVal1
6 anotherVal2
7 anotherVal3
如何在SQLserver 2008 StoredProcedure中实现这一目标? 我总是假设查询是迭代的,他们会检查每行的条件。但似乎聚合函数只执行一次!
编辑1
请回答这个问题 只有完成SELECT语句后,INSERT才会起作用。这就是为什么我没有按预期得到结果???我是对的吗?
答案 0 :(得分:4)
使用row_number函数为行提供序号
insert into Table1 (column1,column2)
select
(select max(column1) from Table1) + row_number() over (order by T2.anotherColumn),
T2.anotherColumn
from Table2 as T2
或更安全的版本(即使表1中没有任何行,它也会起作用):
insert into Table1 (column1,column2)
select
isnull(T1.m, 0) + row_number() over (order by T2.anotherColumn),
T2.anotherColumn
from Table2 as T2
outer apply (select max(column) as m from Table1) as T1
答案 1 :(得分:3)
我知道这个问题已经回答了,但是解决方案甚至可以进一步简化?
怎么样?INSERT INTO TABLE1 (column1,column2)
SELECT ISNULL((SELECT MAX(column1) FROM TABLE1),0)
+ROW_NUMBER() OVER (ORDER BY anotherColumn),
anotherColumn FROM TABLE2