SQL查询:获取col2含56和59但不含11的col1值
解决思路与SQL实现
嘿,这个需求其实用分组聚合或者多条件子查询都能搞定,我给你两种常用方案:
方案一:GROUP BY + HAVING 聚合判断
这是最直观的方法,通过分组后检查每个col1组的col2值是否满足所有条件:
SELECT col1 FROM your_table_name GROUP BY col1 HAVING -- 确保组内存在col2=56 SUM(CASE WHEN col2 = 56 THEN 1 ELSE 0 END) > 0 -- 确保组内存在col2=59 AND SUM(CASE WHEN col2 = 59 THEN 1 ELSE 0 END) > 0 -- 确保组内完全没有col2=11 AND SUM(CASE WHEN col2 = 11 THEN 1 ELSE 0 END) = 0;
逻辑解释:
GROUP BY col1把相同col1的行归为一组- 第一个
SUM(...)>0:统计组内col2=56的行数,大于0说明存在该值 - 第二个
SUM(...)>0:同理,确保组内有col2=59 - 第三个
SUM(...) =0:统计col2=11的行数等于0,说明完全没有这个值
用你的示例数据跑这个查询,结果正好是C,符合预期。
方案二:多EXISTS子查询
如果你的表数据量很大,这种方法可能性能更优(因为可以利用col2的索引):
SELECT DISTINCT col1 FROM your_table_name t1 -- 存在同一col1下的col2=56 WHERE EXISTS ( SELECT 1 FROM your_table_name t2 WHERE t2.col1 = t1.col1 AND t2.col2 = 56 ) -- 存在同一col1下的col2=59 AND EXISTS ( SELECT 1 FROM your_table_name t3 WHERE t3.col1 = t1.col1 AND t3.col2 = 59 ) -- 不存在同一col1下的col2=11 AND NOT EXISTS ( SELECT 1 FROM your_table_name t4 WHERE t4.col1 = t1.col1 AND t4.col2 = 11 );
逻辑解释:
- 外层查询遍历每个
col1,通过三个子查询分别验证三个条件 EXISTS会在找到匹配行后立即停止查找,比全表聚合更高效(如果有合适索引的话)DISTINCT确保结果里每个col1只出现一次
这两种方法都能完美解决你的问题,你可以根据自己表的实际数据量和索引情况选择合适的方案~
内容的提问来源于stack exchange,提问作者Catazza
相关产品推荐
相关产品推荐

