高手帮忙:我有两条超难的SQL语句,一条有问题,一条写不出

时间:2021-08-27 20:38:19
数据库sybase
表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 --只更新本次加入的记录

#2


这么复杂

#3


老兄你是想研究sql还是想解决问题?解决问题应该可以用比这简单的多的办法呀。
表结构也不合理,至少不符合表设计的规范吧。
而且如果在max上建个索引的话,max(max)效率会非常高的,为什么不用?

#4


呵呵,万一删除了一条记录,那求和就不对头了。

#5


所以,在删除记录的时候,还要再减掉,真是太复杂了。还是换个法子吧。

#6


dennis2001:
现在用的就是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 --只更新本次加入的记录

#2


这么复杂

#3


老兄你是想研究sql还是想解决问题?解决问题应该可以用比这简单的多的办法呀。
表结构也不合理,至少不符合表设计的规范吧。
而且如果在max上建个索引的话,max(max)效率会非常高的,为什么不用?

#4


呵呵,万一删除了一条记录,那求和就不对头了。

#5


所以,在删除记录的时候,还要再减掉,真是太复杂了。还是换个法子吧。

#6


dennis2001:
现在用的就是sum(num)和max(max),考虑到这个表会以每天上万条记录的速度添加,以后sum可能会很慢。我也很想搞清楚那条语句到底什么地方有漏洞。
genphone_ru:
这个表的记录是不会删除的。