VFP跨表更新:如何通过销售表扣减库存表数据(字段名不同)
关联字段名不同时更新库存表的解决方案
- 完全不需要重命名销售表的
id_reg字段,直接通过关联条件就能完成库存扣减,强烈不推荐用Do … While循环,单条SQL更新语句效率高得多。
直接用UPDATE JOIN的方式就能实现,以MySQL为例:
UPDATE inventory i JOIN ( -- 先统计每个商品的总销量 SELECT id_reg, SUM(sales_quantity) AS total_sold FROM sales GROUP BY id_reg ) s ON i.id = s.id_reg -- 这里直接用不同字段做关联条件 SET i.stock_quantity = i.stock_quantity - s.total_sold;
如果一定要用循环(比如特定业务场景需求),也不需要重名字段,核心还是通过id和id_reg的匹配来更新,比如在MySQL存储过程里的写法:
DECLARE done INT DEFAULT FALSE; DECLARE reg_id INT; DECLARE sold_qty INT; -- 定义游标读取每个商品的总销量 DECLARE cur CURSOR FOR SELECT id_reg, SUM(sales_quantity) FROM sales GROUP BY id_reg; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; OPEN cur; read_loop: LOOP FETCH cur INTO reg_id, sold_qty; IF done THEN LEAVE read_loop; END IF; -- 直接用id匹配reg_id更新库存 UPDATE inventory SET stock_quantity = stock_quantity - sold_qty WHERE id = reg_id; END LOOP; CLOSE cur;
注意:循环更新的性能远不如批量更新,数据量大时容易引发锁表、超时问题,能不用就不用。
内容的提问来源于stack exchange,提问作者Job Silva Ramirez
相关产品推荐
相关产品推荐

