如何编写SQL查询:筛选含B/C类型或仅含A类型的行
实现需求的SQL查询方案
针对你的需求,这里提供两种通用的SQL实现方式,适用于大多数主流数据库(如MySQL、PostgreSQL、SQL Server等):
方法一:使用窗口函数
通过窗口函数统计每个编号下B/C类型的行数,再根据统计结果筛选数据:
SELECT Number, Type FROM ( SELECT Number, Type, -- 统计当前编号下B/C类型的行数 COUNT(CASE WHEN Type IN ('B', 'C') THEN 1 END) OVER (PARTITION BY Number) AS bc_count FROM your_table -- 替换为你的实际表名 ) t -- 筛选规则:有B/C则只留B/C,无B/C则保留A WHERE (bc_count > 0 AND Type IN ('B', 'C')) OR bc_count = 0;
方法二:使用EXISTS子查询
通过子查询判断当前编号是否存在B/C类型的行,再进行筛选:
SELECT Number, Type FROM your_table t1 -- 替换为你的实际表名 WHERE -- 直接保留B/C类型的行 Type IN ('B', 'C') -- 或者当前编号不存在任何B/C行时,保留该行(即A类型) OR NOT EXISTS ( SELECT 1 FROM your_table t2 WHERE t2.Number = t1.Number AND t2.Type IN ('B', 'C') );
说明
两种方法都能实现预期结果,你可以根据自己使用的数据库特性和数据规模选择:
- 窗口函数写法逻辑清晰,适合理解和维护;
- EXISTS子查询在某些数据库中可能有更好的性能表现,尤其是表数据量较大时。
内容的提问来源于stack exchange,提问作者zedge08
相关产品推荐
相关产品推荐

