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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:01:29