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
相关产品推荐
相关产品推荐

