如何用SQL查询仅存在Inactive状态的唯一ProductID
筛选仅含Inactive状态的ProductID解决方案
嘿,这个需求我太懂了!咱们要找的是那些从头到尾只有Inactive状态的ProductID,只要某个ProductID出现过哪怕一次Active,都得把它排除掉。下面给你两种实用的SQL写法,都能得到你想要的结果:
方法一:用NOT EXISTS子查询
这种方法逻辑直观,先锁定Inactive的记录,再排除掉存在对应Active记录的ProductID:
SELECT DISTINCT ProductID, Status FROM your_table t1 WHERE Status = 'Inactive' AND NOT EXISTS ( SELECT 1 FROM your_table t2 WHERE t2.ProductID = t1.ProductID AND t2.Status = 'Active' );
逻辑解释:
- 先从表中筛选出所有状态为
Inactive的记录 - 通过
NOT EXISTS子查询,检查当前ProductID有没有对应的Active状态记录 - 用
DISTINCT去重,避免像ProductID 152478那样多条重复的Inactive记录出现在结果里
方法二:用GROUP BY + HAVING分组筛选
这种方法通过分组统计来直接定位符合条件的ProductID:
SELECT ProductID, 'Inactive' AS Status FROM your_table GROUP BY ProductID HAVING COUNT(DISTINCT Status) = 1 AND MAX(Status) = 'Inactive';
逻辑解释:
- 按
ProductID分组,把同一个ProductID的所有记录归为一组 COUNT(DISTINCT Status) = 1确保这个组里只有一种状态MAX(Status) = 'Inactive'确保这唯一的状态就是Inactive- 直接指定Status为'Inactive',因为我们已经确认该ProductID只有这个状态
原始数据表
+-----------+----------+ | ProductID | Status | +-----------+----------+ | 152141 | Active | | 152141 | Inactive | | 157874 | Active | | 152478 | Inactive | | 152478 | Inactive | | 157875 | Active | | 157875 | Active | | 157875 | Inactive | +-----------+----------+
执行后期望结果
+-----------+----------+ | ProductID | Status | +-----------+----------+ | 152478 | Inactive | +-----------+----------+
内容的提问来源于stack exchange,提问作者rocky09
相关产品推荐
相关产品推荐

