You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL 5.7.34下关联Invoice表与Items表查询所有商品剩余库存的SQL实现问题

解决方法:使用左连接并处理空值

你的问题核心出在使用了内连接(INNER JOIN)——这种连接逻辑只会返回两张表中item_number完全匹配的记录,自然无法覆盖Items表中没有对应Invoice记录的商品。要实现显示全量商品剩余库存的需求,我们需要改用左连接(LEFT JOIN),同时处理累计Qty为空的特殊情况。

修改后的SQL语句

SELECT 
    items.item_number AS item_number,
    items.Item_Desc AS itemdesc,
    items.Start_Balance - IFNULL(SUM(invoice.qty), 0) AS currentitembalance
FROM items
LEFT JOIN invoice ON invoice.item_number = items.item_number
GROUP BY items.item_number, items.Item_Desc, items.Start_Balance;

关键改动详解

  1. 替换连接类型为LEFT JOIN:左连接会完整保留items表的所有记录,即使invoice表中没有匹配的item_number,对应invoice侧的字段会被填充为NULL,确保不会遗漏任何商品。
  2. 用IFNULL处理空聚合值:当某个商品没有任何发票记录时,SUM(invoice.qty)会返回NULL,直接与Start_Balance相减会得到NULL结果。IFNULL(SUM(invoice.qty), 0)可以把空值转换成0,保证剩余库存计算逻辑的正确性。
  3. 规范GROUP BY字段:MySQL 5.7默认开启ONLY_FULL_GROUP_BY模式,要求SELECT中所有非聚合字段必须出现在GROUP BY子句中,所以我们把items.Item_Desc和items.Start_Balance也加入分组(如果你的SQL模式关闭了该检查,这部分可简化,但推荐遵循规范写法)。

效果验证

执行上述语句后,你会得到Items表中所有商品的剩余库存:

  • 有对应发票记录的商品:用初始库存减去累计出库数量
  • 无发票记录的商品:剩余库存直接等于初始库存

内容的提问来源于stack exchange,提问作者user17112781

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 17:32:38