SQL查询问题:如何获取col1中对应col2含10、20、30值的记录?
解决方法:筛选对应col2包含多个值的col1记录
首先得明确为什么用AND会返回空结果:单条记录的col2只能是一个值,你写的col2 = 10 AND col2 = 20 AND col2 = 30要求同一条记录同时满足三个值,这显然不可能,所以自然返回空集。
下面给你两种常用的正确实现方式:
方法1:分组筛选(最常用)
通过GROUP BY按col1分组,再用HAVING子句确保分组内包含所有目标col2值:
只获取符合条件的col1
SELECT col1 FROM your_table WHERE col2 IN ('10', '20', '30') -- 先过滤掉无关记录,提升查询效率 GROUP BY col1 HAVING COUNT(DISTINCT col2) = 3; -- 确保三个值都存在(用DISTINCT避免col2重复计数)
获取所有符合条件的完整记录
如果需要返回这些col1对应的所有原始记录,可以用子查询关联原表:
SELECT t.* FROM your_table t INNER JOIN ( SELECT col1 FROM your_table WHERE col2 IN ('10', '20', '30') GROUP BY col1 HAVING COUNT(DISTINCT col2) = 3 ) qualified_col1 ON t.col1 = qualified_col1.col1;
方法2:多EXISTS子查询(更直观的存在性检查)
用多个EXISTS子句分别验证每个目标值是否存在于同一个col1组中:
SELECT DISTINCT t.* FROM your_table t WHERE EXISTS ( SELECT 1 FROM your_table WHERE col1 = t.col1 AND col2 = '10' ) AND EXISTS ( SELECT 1 FROM your_table WHERE col1 = t.col1 AND col2 = '20' ) AND EXISTS ( SELECT 1 FROM your_table WHERE col1 = t.col1 AND col2 = '30' );
这种方法不需要分组,适合逻辑清晰化的场景,即使col2有重复值也不影响结果。
注意事项
- 如果
col2是数字类型,记得去掉值的引号(比如写成col2 = 10而不是col2 = '10'); - 你的数据里有
a 05,如果col2是数字类型,05会被存储为5,要注意数据类型的一致性哦。
内容的提问来源于stack exchange,提问作者Fshamri
相关产品推荐
相关产品推荐

