Oracle SQL查询需求:筛选同时包含ABC和ANQ的分组数据
Oracle SQL 查询:筛选同时包含指定元素的分组并返回全部分组数据
方法一:子查询 + GROUP BY HAVING
这种方法先筛选出符合条件的分组ID,再关联原表返回全部分组数据,逻辑清晰且兼容性好:
SELECT t."group X", t."Column Q" FROM your_table t WHERE t."group X" IN ( SELECT "group X" FROM your_table WHERE "Column Q" IN ('ABC', 'ANQ') GROUP BY "group X" HAVING COUNT(DISTINCT "Column Q") = 2 );
逻辑说明:
- 子查询中先过滤出
Column Q为'ABC'或'ANQ'的记录 - 按
group X分组后,通过COUNT(DISTINCT "Column Q") = 2确保该分组同时包含两个目标元素 - 外层查询关联符合条件的分组,返回该分组下的所有数据行
方法二:窗口函数(Oracle 12c+)
如果使用较新版本的Oracle,窗口函数可以避免子查询关联,效率更优:
WITH group_check AS ( SELECT "group X", "Column Q", -- 统计当前分组内是否存在'ABC' COUNT(CASE WHEN "Column Q" = 'ABC' THEN 1 END) OVER (PARTITION BY "group X") AS has_abc, -- 统计当前分组内是否存在'ANQ' COUNT(CASE WHEN "Column Q" = 'ANQ' THEN 1 END) OVER (PARTITION BY "group X") AS has_anq FROM your_table ) SELECT "group X", "Column Q" FROM group_check WHERE has_abc > 0 AND has_anq > 0;
逻辑说明:
- 用
PARTITION BY "group X"在每个分组内计算目标元素的出现次数 - 筛选出两个目标元素都存在(次数大于0)的分组数据
注意事项
- 将代码中的
your_table替换为你的实际表名 - 如果
Column Q在同一个group X内不会重复出现,子查询中的COUNT(DISTINCT)可以简化为COUNT(*),但保留DISTINCT能避免同一元素重复出现导致的误判
验证结果
针对你提供的样本数据,执行上述任意一种查询,都会返回:
group X Column Q -------- --------- 123 ABC 123 AAA 123 ANQ
内容的提问来源于stack exchange,提问作者Captain Tyler
相关产品推荐
相关产品推荐

