如下表
create table t1
(
indate datetime,
m1 numeric(10,2)
)
数据如下
2005-11-01 1000.05
2005-05-01 6500.50
2006-01-01 10035.50
2004-05-09 20350.00
...
用update语句对m1进行处理,但是必须按照indate的时间先后进行处理。也就是说处理记录的先后顺序必须如下
2004-05-09
2005-05-01
2005-11-01
2006-01-01
...
请问不用游标如何实现?
create table t1
(
indate datetime,
m1 numeric(10,2)
)
数据如下
2005-11-01 1000.05
2005-05-01 6500.50
2006-01-01 10035.50
2004-05-09 20350.00
...
用update语句对m1进行处理,但是必须按照indate的时间先后进行处理。也就是说处理记录的先后顺序必须如下
2004-05-09
2005-05-01
2005-11-01
2006-01-01
...
请问不用游标如何实现?
SELECT *,identity(int,1,1) as id INTO #B FROM t1 order by indate
Update t1
set m1=所要处理的操作
where #A.id=#B.id
Drop #A
Drop #B
-------
性能不好
期待高手
但是t1如果很多的记录,处理起来太耗时吧
update #t1_t set #t1_t.m1 = #t1_t.m1 + 0.5
delete t1 -- where.....
insert t1 select * from #t1_t
drop table #t1_t考查其实质性过程:
更新动作将在原表或者原表索引上搜索符合where记录出来到缓存区,而这一过程和搜索出来的数据将是顺序进行和按物理顺序的(也即是update ... where 后面不能跟order by,它将从原表或者索引表自上而下逐行匹配where条件,符合的就抽取出来放到缓存区).更新数据时,就对缓存区数据逐条顺序更改.更改完毕回写数据表时,也是自上而下顺序回写.基于上述理解,认为除非能改变update缓存区的先后顺序,才有可能实现update的先后顺序.而目前只能自行虚拟建立这个过程.(即先把要update的数据按更新顺序缓存到临时表,再对临时表进行update动作,最后回写到原表)濡染理解得不对,请多多指教:)