当前位置: 代码迷 >> Sql Server >> mssql 在update语句中怎么使用order by
  详细解决方案

mssql 在update语句中怎么使用order by

热度:787   发布时间:2016-04-24 09:23:31.0
mssql 在update语句中如何使用order by
直接上代码

DECLARE @tb table(id int,num INT,mat INT)               
insert @tb select 1,8,1                 
insert @tb select 3,8,-1               
insert @tb select 2,4,1                 
insert @tb select 6,7,-1                 
insert @tb select 4,3,1                  
insert @tb select 5,3,1 
SELECT * FROM @tb

我要对这个表进行num字段的累计,有2个要求:
1.mat 字段必须为正才进行累计
2.要按id的顺序进行累计。
已经实现了要求1,目前在研究怎么实现2,这个必须要有!
我现在的代码:

declare @count INT set @count=0 
update @tb SET @count=(CASE WHEN CONVERT(INT,mat)>0 THEN @count+num ELSE @count END ),num=@count
select * from @tb  


------解决思路----------------------
update 中能用order by 吗???
------解决思路----------------------
--試試以下:
DECLARE @tb table(id int,num INT,mat INT)               
insert @tb select 1,8,1                 
insert @tb select 3,8,-1               
insert @tb select 2,4,1                 
insert @tb select 6,7,-1                 
insert @tb select 4,3,1                  
insert @tb select 5,3,1 
SELECT * FROM @tb ORDER BY id

declare @count INT set @count=0;
WITH a1 AS
(
SELECT *,ROW_NUMBER() OVER (ORDER BY id) re FROM @tb
)
update @tb SET @count=(CASE WHEN CONVERT(INT,mat)>0 THEN @count+num ELSE @count END ),num=@count
select * from @tb ORDER BY id

------解决思路----------------------
DECLARE @tb table(id int,num INT,mat INT)               
insert @tb select 1,8,1                 
insert @tb select 3,8,-1               
insert @tb select 2,4,1                 
insert @tb select 6,7,-1                 
insert @tb select 4,3,1                  
insert @tb select 5,3,1 

;WITH cte AS
(
select 
n.id, 
n.num,
sumnum=(SELECT SUM(CASE mat WHEN -1 THEN 0 ELSE num END) FROM @tb m WHERE m.id <= n.id) ,
n.mat
from @tb n
)
UPDATE cte
SET num = sumnum

SELECT * FROM @tb ORDER BY id
/*
id num mat
1 8 1
2 12 1
3 12 -1
4 15 1
5 18 1
6 18 -1
*/

------解决思路----------------------
WITH 通常与AS连用,也叫做子查询部分。用法:
1)可用来定义一个SQL片断,该片断会被整个SQL语句所用到。
2)为了让SQL语句的可读性更高
3)也有可能是在UNION ALL的不同部分,作为提供数据的部分。特别对于UNION ALL比较有用。因为UNION ALL的每个部分可能相同,但是如果每个部分都去执行一遍的话,则成本太高,所以可以使用WITH AS短语,则只要执行一遍即可。
------解决思路----------------------
先用cte或者临时表,存放你需要更新的数据,然后再update原表。顺序这个东西在临时表或者CTE中先处理好即可
------解决思路----------------------
不建议update的时候去做排序,会影响性能
------解决思路----------------------
14W的话一次update消耗很大,特别是日志的增长量,如果不是实时操作,可以考虑用大容量日志模式来处理然后再恢复到完整模式,同时5000每次这样会快很多
  相关解决方案