Foxtable(狐表)用户栏目专家坐堂 → SQL中遍历表每行计算应该如何实现效率才高?


  共有2302人关注过本帖树形打印复制链接

主题:SQL中遍历表每行计算应该如何实现效率才高?

帅哥哟,离线,有人找我吗?
有点甜
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2017/12/20 17:35:00 [显示全部帖子]

呃,有必要这样处理吗?你这种,基本都是用查询、子查询直接得到计算结果的。

 

如果要更新,同样用update语句直接查询和更新。

 

看看sqlserver流水账的设计 https://www.baidu.com/baidu?wd=sqlserver+%E6%B5%81%E6%B0%B4%E8%B4%A6

 


 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2017/12/20 20:12:00 [显示全部帖子]

 你需要的就是流水账的查询语句,比如,可以简化成这样

 

https://www.cnblogs.com/Fooo/p/4070030.html

 


 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2017/12/20 22:33:00 [显示全部帖子]

1、可用库存是需要计算求出的,不是取第一行的数据,就好像流水账那样,计算余额

 

https://www.cnblogs.com/Fooo/p/4070030.html

 

2、既然能够select出数据了,那update就一句语句即可

 

3、不会做就上传测试实例。


 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2017/12/21 23:07:00 [显示全部帖子]

测试了一下,没有变通方法,必须一行一行计算,如

 

declare m_cursor cursor scroll for
select 产品编码,需求日期 from MPS03 ORDER BY 产品编码,需求日期
for update
-- 打开游标
open m_cursor
declare   @bm varchar(50), @date date, @kykc float, @pbm varchar(50)
--填充数据
fetch next from m_cursor into @bm, @date
--假如检索到了数据,才处理
while @@FETCH_STATUS=0
begin
    if @bm = @pbm
        UPDATE MPS03 SET 期初库存=@kykc,净需求=需求数量+预计出库-期初库存-预计入库,计划产出=case when 需求数量+预计出库-期初库存-预计入库 > 0 then CEILING((需求数量+预计出库-期初库存-预计入库)/批量)*批量 else 0 end, 可用库存=(case when 需求数量+预计出库-期初库存-预计入库 > 0 then CEILING((需求数量+预计出库-期初库存-预计入库)/批量)*批量 else 0 end)-(需求数量+预计出库-期初库存-预计入库) WHERE current of m_cursor
    else
  UPDATE MPS03 SET 净需求=需求数量+预计出库-期初库存-预计入库,计划产出=case when 需求数量+预计出库-期初库存-预计入库 > 0 then CEILING((需求数量+预计出库-期初库存-预计入库)/批量)*批量 else 0 end, 可用库存=(case when 需求数量+预计出库-期初库存-预计入库 > 0 then CEILING((需求数量+预计出库-期初库存-预计入库)/批量)*批量 else 0 end)-(需求数量+预计出库-期初库存-预计入库) WHERE current of m_cursor
    update mps03 set @kykc = 可用库存 WHERE current of m_cursor
    --填充下一条数据
    set @pbm = @bm
   
    fetch next from m_cursor into @bm, @date
end
-- 关闭游标
close m_cursor
--释放游标
deallocate m_cursor

select * from MPS03 ORDER BY 产品编码,需求日期

[此贴子已经被作者于2017/12/22 8:53:31编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2017/12/22 8:58:00 [显示全部帖子]

以下是引用HappyFt在2017/12/22 0:04:00的发言:
我测试了下才两秒钟就执行完了,为什么这么快?谢谢了

 

使用游标本身就不慢,只是相对于查询、修改的语句来说慢一点而已,因为数据引擎不能对其进行优化。

 

看懂sql语句,只要能实现结果就好。


 回到顶部