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

SQL技术问询:筛选仅包含指定商品(A、B、C)的未删除订单

修正筛选目标订单的SQL语句

我来帮你解决这个SQL筛选的问题!你当前的语句之所以会包含订单102(带有商品D),是因为它只统计了订单里包含多少种A/B/C商品,但没有检查订单是否存在不属于A/B/C的商品。咱们需要调整逻辑,确保订单里的所有商品都在A、B、C范围内,同时满足订单未删除、至少包含其中一种商品的要求。

方案一:使用GROUP BY + HAVING条件约束

这种方法通过聚合统计来排除含无关商品的订单:

SELECT o.id AS order_id
FROM Orders o
JOIN Order_items oi ON o.id = oi.order_id
WHERE o.deleted_at IS NULL
GROUP BY o.id
HAVING 
  -- 确保订单中没有任何非A/B/C的商品
  SUM(CASE WHEN oi.product NOT IN ('A', 'B', 'C') THEN 1 ELSE 0 END) = 0
  -- 确保至少包含一种A/B/C商品(可选,因为JOIN后必然有订单商品,但加上更严谨)
  AND COUNT(DISTINCT oi.product) >= 1;

方案二:使用EXISTS/NOT EXISTS逻辑判断

这个方案逻辑更直观,直接排查订单的商品范围:

SELECT o.id AS order_id
FROM Orders o
WHERE o.deleted_at IS NULL
-- 确保订单至少包含一个A/B/C商品
AND EXISTS (
  SELECT 1 
  FROM Order_items oi 
  WHERE oi.order_id = o.id 
    AND oi.product IN ('A', 'B', 'C')
)
-- 确保订单没有任何非A/B/C的商品
AND NOT EXISTS (
  SELECT 1 
  FROM Order_items oi 
  WHERE oi.order_id = o.id 
    AND oi.product NOT IN ('A', 'B', 'C')
);

为什么原语句会出错?

你的原语句里,CASE WHEN只对A/B/C的商品计数,完全忽略了订单里是否有其他商品。比如订单102包含A和D,COUNT(DISTINCT CASE...)会得到1(只统计了A),满足BETWEEN 1 AND 3的条件,所以被错误筛选出来。而上面的两种方案都补上了“排除无关商品”的逻辑,就能得到你预期的结果:101、103、106、107。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 18:57:29