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

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;

逻辑拆解:

  1. (SELECT DISTINCT StoreID FROM Inventory) s:先获取所有有库存记录的门店,保证我们只处理实际存在的门店(如果需要包含无任何库存的门店,这里替换成专门的门店表即可)
  2. CROSS JOIN Product p:把每个门店和所有商品进行配对,得到所有可能的「门店-商品」组合
  3. LEFT JOIN Inventory i:关联库存表后,有库存的记录会显示库存数,无库存的记录库存字段会是NULL
  4. WHERE 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:02:13