You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 02:57:13