如何编写SQL查询筛选同时包含A、B、C的Id
筛选同时包含全部指定Value的Id的SQL查询
给定数据表(假设表名为your_table)的数据如下:
| Id | Value |
|---|---|
| 1 | A |
| 1 | B |
| 2 | A |
| 2 | C |
| 3 | A |
| 3 | B |
| 3 | C |
需要筛选出同时拥有Value为A、B、C的Id,预期结果为3。
方法一:分组统计法
这是最常用的方案,通过分组后统计符合条件的Value数量来筛选:
SELECT Id FROM your_table WHERE Value IN ('A', 'B', 'C') GROUP BY Id HAVING COUNT(DISTINCT Value) = 3;
逻辑说明:
WHERE Value IN ('A', 'B', 'C'):先过滤出只包含目标Value的记录,减少后续分组计算的数据量GROUP BY Id:按Id分组,把同一个Id的所有Value记录聚合到一起HAVING COUNT(DISTINCT Value) = 3:统计每个分组中不同Value的数量,等于3说明该Id同时包含A、B、C三个值(用DISTINCT是为了避免同一Id下出现重复Value导致计数不准的情况,如果你的数据中每个Id的Value不会重复,也可以用COUNT(*) = 3)
方法二:多表关联法
如果需要更直观的匹配逻辑,也可以用自关联的方式:
SELECT DISTINCT t1.Id FROM your_table t1 JOIN your_table t2 ON t1.Id = t2.Id AND t2.Value = 'B' JOIN your_table t3 ON t1.Id = t3.Id AND t3.Value = 'C' WHERE t1.Value = 'A';
逻辑说明:
通过三次关联同一个表,分别匹配包含A、B、C的记录,只有同时满足三个关联条件的Id才会被筛选出来,最后用DISTINCT去重(确保每个Id只出现一次)。
两种方法都能得到预期结果:
| Id |
|---|
| 3 |
内容的提问来源于stack exchange,提问作者Manta
相关产品推荐
相关产品推荐

