SQL中如何筛选仅含STATUS=10无STATUS=20的订单整行数据?
解决SQL筛选仅存在STATUS=10的订单问题
我来帮你搞定这个问题~你原来写的SQL之所以没达到预期效果,是因为它只对单一行做条件判断,而没有考虑整个订单的状态集合。比如订单50里有一行STATUS=10,这行会被你的WHERE条件选中,但这个订单其实还有STATUS=20的记录,完全不符合你要的“仅存在STATUS=10、不存在STATUS=20”的要求。
下面给你几种可行的解决方案:
方法1:使用NOT EXISTS子查询(推荐,性能通常较好)
这种方法先筛选出STATUS=10的行,同时确保对应的订单没有任何STATUS=20的记录:
SELECT * FROM ordertable OT WHERE OT.STATUS = 10 AND NOT EXISTS ( SELECT 1 FROM ordertable OT2 WHERE OT2.ORDER = OT.ORDER AND OT2.STATUS = 20 );
方法2:用GROUP BY + HAVING先筛选订单,再关联原表
先找出所有没有STATUS=20的订单,再和原表关联获取完整行数据:
-- 第一步:筛选符合要求的订单号 WITH ValidOrders AS ( SELECT ORDER FROM ordertable GROUP BY ORDER HAVING COUNT(CASE WHEN STATUS = 20 THEN 1 END) = 0 ) -- 第二步:关联原表获取完整行 SELECT OT.* FROM ordertable OT JOIN ValidOrders VO ON OT.ORDER = VO.ORDER WHERE OT.STATUS = 10;
如果你的STATUS只有10和20两种取值,还可以用更简洁的HAVING写法:HAVING MAX(STATUS) = 10。
方法3:LEFT JOIN排除法
通过左连接STATUS=20的记录,筛选出连接不上的订单(即没有STATUS=20的订单):
SELECT OT.* FROM ordertable OT LEFT JOIN ordertable OT2 ON OT.ORDER = OT2.ORDER AND OT2.STATUS = 20 WHERE OT.STATUS = 10 AND OT2.ORDER IS NULL;
这几种方法都能正确返回你需要的结果:订单55、60的完整行数据(因为它们只有STATUS=10,没有STATUS=20的记录)。
内容的提问来源于stack exchange,提问作者AdilMK
相关产品推荐
相关产品推荐

