如何用SQL的AND/EXISTS条件筛选同时包含AA和AB的数据
解决SQL查询同时包含AA和AB条目的问题
场景1:同一分组下有多条记录(如p2对应多个p1值)
从你最后一条查询返回s1的结果来看,数据应该是同一p2分组下对应多条p1记录的结构(比如s1下有AA和AB两条记录,其他分组各有一条)。要筛选出这类同时包含AA和AB的分组下的所有条目,可用以下两种方法:
方法1:GROUP BY + 关联查询
SELECT t.* FROM tabl1 t JOIN ( SELECT p2 FROM tabl1 WHERE p1 IN ('AA', 'AB') GROUP BY p2 HAVING COUNT(DISTINCT p1) = 2 ) AS filtered ON t.p2 = filtered.p2
先通过子查询筛选出同时包含AA和AB的p2分组,再关联原表获取该分组下的所有完整记录。
方法2:双重EXISTS验证
SELECT * FROM tabl1 t WHERE EXISTS ( SELECT 1 FROM tabl1 WHERE p2 = t.p2 AND p1 = 'AA' ) AND EXISTS ( SELECT 1 FROM tabl1 WHERE p2 = t.p2 AND p1 = 'AB' )
通过两次EXISTS分别校验同一p2分组下是否存在AA和AB的记录,满足条件则返回该分组的所有条目。
场景2:p1字段是多值字符串(如"AA,AB")
如果第三条数据的p1字段直接存储了多个值(比如用逗号分隔的字符串),要筛选同时包含AA和AB的行,可用模糊匹配:
SELECT * FROM tabl1 WHERE p1 LIKE '%AA%' AND p1 LIKE '%AB%'
⚠️ 注意:这种多值存储方式不符合数据库设计规范,建议拆分成分组关联表(即场景1的结构),便于后续查询和维护。
你的错误尝试分析
- 第一个查询
WHERE p1 IN ('AA','AB'):IN是精确匹配单个值,只要p1等于AA或AB就会被选中,所以前两条单独的AA、AB记录会被返回;如果第三条是多值字符串,这条语句不会匹配它,侧面说明你的数据更符合场景1的结构。 - 第二个查询:GROUP BY p1后,每个分组的p1只能是AA或AB,HAVING条件要求p1同时属于两个值,逻辑矛盾,所以返回空。
- 最后一个EXISTS语句:语法不完整(缺少闭合括号),且子查询未关联主表,会返回所有记录,达不到筛选效果。
内容的提问来源于stack exchange,提问作者Groothy
相关产品推荐
相关产品推荐

