表b_test中有如下字段:
water_no: 每次往表中写入一批数据都有不同的water_no区别
product_id: 产品的ID
num: 计数
all_num: 累计计数
max: 某最大值
all_max: 累计的最大值
问题1: --更新累计数量(因为表可能会滚得很大,所以不想直接用sum求和,希望用上一次的累计数量加上这一次的数量来实现)
update b_test
set a.all_num=(select b.all_num+a._num
from b_test b
where b.water_no=isnull((select max(c.water_no) --查找这个产品的上一个记录的流水号,没有则用这次的(其all_num已填0)
from b_test c
where c.product_id=a.product_id and
c.water_no<>a.water_no),a.water_no)
and
a.product_id=b.product_id)
from b_test a
where a.water_no=@WaterNo --只更新本次加入的记录
这条语句我在小数据量测试数据的时候正常,数据复杂后运行数据库报错,大概是说企图向一个值里面写入多个数据。大家帮我看看有什么漏洞。
问题2: --更新累计最大值,也不想用MAX(max),只想和上一条记录的all_max比较,把大的写入这条记录的all_max,
这个我写不出,如何比较两个值,取出大的那一个?请高手帮忙!
ps:数据量大,不能用游标。
6 个解决方案
#1
排好格式的:
update b_test
set a.all_num=(select b.all_num+a._num
from b_test b
--查找这个产品的上一个记录的流水号,没有则用这次的(其all_num已填0)
where b.water_no=isnull((select max(c.water_no)
from b_test c
where c.product_id=a.product_id and
c.water_no<>a.water_no),a.water_no)
and
a.product_id=b.product_id)
from b_test a
where a.water_no=@WaterNo --只更新本次加入的记录
update b_test
set a.all_num=(select b.all_num+a._num
from b_test b
--查找这个产品的上一个记录的流水号,没有则用这次的(其all_num已填0)
where b.water_no=isnull((select max(c.water_no)
from b_test c
where c.product_id=a.product_id and
c.water_no<>a.water_no),a.water_no)
and
a.product_id=b.product_id)
from b_test a
where a.water_no=@WaterNo --只更新本次加入的记录
#2
这么复杂
#3
老兄你是想研究sql还是想解决问题?解决问题应该可以用比这简单的多的办法呀。
表结构也不合理,至少不符合表设计的规范吧。
而且如果在max上建个索引的话,max(max)效率会非常高的,为什么不用?
表结构也不合理,至少不符合表设计的规范吧。
而且如果在max上建个索引的话,max(max)效率会非常高的,为什么不用?
#4
呵呵,万一删除了一条记录,那求和就不对头了。
#5
所以,在删除记录的时候,还要再减掉,真是太复杂了。还是换个法子吧。
#6
dennis2001:
现在用的就是sum(num)和max(max),考虑到这个表会以每天上万条记录的速度添加,以后sum可能会很慢。我也很想搞清楚那条语句到底什么地方有漏洞。
genphone_ru:
这个表的记录是不会删除的。
现在用的就是sum(num)和max(max),考虑到这个表会以每天上万条记录的速度添加,以后sum可能会很慢。我也很想搞清楚那条语句到底什么地方有漏洞。
genphone_ru:
这个表的记录是不会删除的。
#1
排好格式的:
update b_test
set a.all_num=(select b.all_num+a._num
from b_test b
--查找这个产品的上一个记录的流水号,没有则用这次的(其all_num已填0)
where b.water_no=isnull((select max(c.water_no)
from b_test c
where c.product_id=a.product_id and
c.water_no<>a.water_no),a.water_no)
and
a.product_id=b.product_id)
from b_test a
where a.water_no=@WaterNo --只更新本次加入的记录
update b_test
set a.all_num=(select b.all_num+a._num
from b_test b
--查找这个产品的上一个记录的流水号,没有则用这次的(其all_num已填0)
where b.water_no=isnull((select max(c.water_no)
from b_test c
where c.product_id=a.product_id and
c.water_no<>a.water_no),a.water_no)
and
a.product_id=b.product_id)
from b_test a
where a.water_no=@WaterNo --只更新本次加入的记录
#2
这么复杂
#3
老兄你是想研究sql还是想解决问题?解决问题应该可以用比这简单的多的办法呀。
表结构也不合理,至少不符合表设计的规范吧。
而且如果在max上建个索引的话,max(max)效率会非常高的,为什么不用?
表结构也不合理,至少不符合表设计的规范吧。
而且如果在max上建个索引的话,max(max)效率会非常高的,为什么不用?
#4
呵呵,万一删除了一条记录,那求和就不对头了。
#5
所以,在删除记录的时候,还要再减掉,真是太复杂了。还是换个法子吧。
#6
dennis2001:
现在用的就是sum(num)和max(max),考虑到这个表会以每天上万条记录的速度添加,以后sum可能会很慢。我也很想搞清楚那条语句到底什么地方有漏洞。
genphone_ru:
这个表的记录是不会删除的。
现在用的就是sum(num)和max(max),考虑到这个表会以每天上万条记录的速度添加,以后sum可能会很慢。我也很想搞清楚那条语句到底什么地方有漏洞。
genphone_ru:
这个表的记录是不会删除的。