Oracle SQL:筛选指定订阅组合且不含A3设施的唯一用户ID
解决SUBSCRIPTIONS表的用户筛选问题
需求明确
要筛选出满足以下两个条件的唯一User Id:
- 该用户拥有
Category='A'、Rank='B'、Method='C'的订阅组合 - 该用户的上述订阅组合中完全不存在
Amenity='A3'的记录
错误写法的问题
之前用WHERE ... AND Amenity != 'A3'的写法只排除了单条A3记录,但如果用户同时有该组合下的A3和其他设施,剩余行仍会让这个用户被错误选中,无法满足“该组合不含A3”的核心要求。
正确实现方案
方案一:使用NOT EXISTS子查询
直接检查用户在目标订阅组合下是否存在A3记录,不存在则保留:
SELECT DISTINCT s.User_Id FROM SUBSCRIPTIONS s WHERE s.Category = 'A' AND s.Rank = 'B' AND s.Method = 'C' AND NOT EXISTS ( SELECT 1 FROM SUBSCRIPTIONS s2 WHERE s2.User_Id = s.User_Id AND s2.Category = 'A' AND s2.Rank = 'B' AND s2.Method = 'C' AND s2.Amenity = 'A3' );
方案二:分组后用HAVING过滤
通过分组统计每个用户在目标组合下的A3记录数,数量为0则符合要求:
SELECT User_Id FROM SUBSCRIPTIONS WHERE Category = 'A' AND Rank = 'B' AND Method = 'C' GROUP BY User_Id HAVING SUM(CASE WHEN Amenity = 'A3' THEN 1 ELSE 0 END) = 0;
样本数据验证
针对你的样本数据,两种方案都会正确返回User Id A001——因为A001在目标订阅组合下没有任何A3记录;而如果有用户同时存在该组合下的A3和其他设施,会被正确排除。
内容的提问来源于stack exchange,提问作者Wayne Eastwood
相关产品推荐
相关产品推荐

