遇到这个问题真实无语,它也不算报错,运行看没有问题也就没管,出来总结果时发现不对了,数据对不上,关键这个语句还是对的,排查起来就很无语。


先介绍下问题:

我有两个表,订单表orders,入库表 goods_in_stock,里面都有 货物名称、数量。想要计算剩下的库存。

 

正常思维就是连接两个表,然后用sum计算对吧,像这样

SELECT a.goods_name , sum(a.in_quantity), sum(b.order_quantity),  (sum(a.in_quantity)-sum(b.order_quantity)) quantity  FROM goods_in_stock a 
left join orders b
on a.goods_name = b.goods_name 
GROUP BY goods_name;

但是结果很明显不对啊。订单表orders 硅矿1的值只有60才对啊,他直接变成了3倍的180....

关键是他还不算错,坑爹啊!!


原因:

最后研究了一下,发现了可能存在这个问题的原因

  • 连接条件不正确:确保连接条件准确匹配了两个表中的相关记录。如果连接条件不正确,可能会导致一个表中的记录与另一个表中的多条记录匹配,从而在求和时出现重复计算。
  • 存在一对多关系:如果两个表之间存在一对多关系,即一个表中的一条记录与另一个表中的多条记录相关联,那么在使用LEFT JOINSUM时可能会出现结果翻倍的情况。

我就是第二个原因,解决方法是在连接之前,先对多表中的数据进行聚合,将数据存放在临时表中,再联合临时表进行查询。具体如下:


解决办法

先把这两个表处理一下,放在临时表里

CREATE TEMPORARY TABLE temp_goods_in_stock
SELECT goods_name, SUM(in_quantity) AS total_in_quantity
FROM goods_in_stock
GROUP BY goods_name;

CREATE TEMPORARY TABLE temp_orders
SELECT goods_name, SUM(order_quantity) AS total_order_quantity
FROM orders
GROUP BY goods_name;

在进行联合查询

select * from  temp_goods_in_stock;
select * from  temp_orders
SELECT t1.goods_name, (t1.total_in_quantity - t2.total_order_quantity) end_quanitity  
FROM temp_goods_in_stock t1
LEFT JOIN temp_orders t2 ON t1.goods_name = t2.goods_name;

这样结果就对了

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐