SQL技术需求:查询各门店无库存的商品列表
解决各门店无库存商品列表的SQL方案
这是一个典型的查找缺失关联组合的问题,核心思路就是先构建所有门店与所有商品的完整配对,再排除掉已经有库存的记录,剩下的就是我们要的无库存商品列表。下面给你两种实用的实现方式:
方法1:交叉连接+左连接筛选
这种方式先生成所有可能的门店-商品组合,再通过左连接匹配库存表,筛选出无库存的记录:
SELECT s.StoreID, p.ProductID, p.Product FROM -- 从库存表提取所有已存在的门店(避免硬编码门店ID) (SELECT DISTINCT StoreID FROM Inventory) s -- 生成每个门店与所有商品的全组合 CROSS JOIN Product p -- 左连接库存表,匹配对应门店和商品的库存记录 LEFT JOIN Inventory i ON s.StoreID = i.StoreID AND p.ProductID = i.ProductID -- 筛选出库存表中无对应记录的(即该门店无此商品库存) WHERE i.Stock IS NULL -- 按门店和商品ID排序,结果更规整 ORDER BY s.StoreID, p.ProductID;
逻辑拆解:
(SELECT DISTINCT StoreID FROM Inventory) s:先获取所有有库存记录的门店,保证我们只处理实际存在的门店(如果需要包含无任何库存的门店,这里替换成专门的门店表即可)CROSS JOIN Product p:把每个门店和所有商品进行配对,得到所有可能的「门店-商品」组合LEFT JOIN Inventory i:关联库存表后,有库存的记录会显示库存数,无库存的记录库存字段会是NULLWHERE i.Stock IS NULL:直接筛选出那些没有库存匹配的记录,就是目标无库存商品
方法2:使用NOT EXISTS子查询
这种方式通过子查询直接判断「门店-商品」组合是否不存在于库存表中:
SELECT s.StoreID, p.ProductID, p.Product FROM (SELECT DISTINCT StoreID FROM Inventory) s, Product p WHERE NOT EXISTS ( -- 检查当前门店-商品组合是否有库存记录 SELECT 1 FROM Inventory i WHERE i.StoreID = s.StoreID AND i.ProductID = p.ProductID ) ORDER BY s.StoreID, p.ProductID;
逻辑拆解:
- 用隐式交叉连接(逗号分隔
s和p)生成所有门店-商品组合 NOT EXISTS子查询会逐一检查当前组合是否在库存表中存在,不存在的就会被选中,也就是无库存的商品
验证示例结果
针对你提供的示例数据,两种方法都会输出期望的结果:
StoreID | ProductID | Product
1 | 4 | 猕猴桃
2 | 2 | 苹果
2 | 3 | 橙子
2 | 4 | 猕猴桃
内容的提问来源于stack exchange,提问作者Patrick Jacob
相关产品推荐
相关产品推荐

