如何编写SQL查询筛选出同时包含指定多值的ID
问题描述
现有数据表(假设表名为your_table):
| id | value |
|---|---|
| 1 | A |
| 1 | B |
| 1 | C |
| 2 | A |
| 2 | B |
| 3 | A |
需要筛选出同时包含A、B、C三个值的ID,预期结果:
| id |
|---|
| 1 |
方法1:分组统计法
这是最常用的方案,通过分组统计每个ID对应的不同值数量来筛选:
SELECT id FROM your_table WHERE value IN ('A', 'B', 'C') GROUP BY id HAVING COUNT(DISTINCT value) = 3;
说明
WHERE子句先过滤掉无关的value,减少后续计算量GROUP BY id按ID分组后,COUNT(DISTINCT value)统计该ID下的不同值数量,等于3则说明同时包含A、B、C- 如果表中同一个ID不会重复出现同一个value,也可以简化为
COUNT(*) = 3
方法2:交集查询法
利用集合交集的逻辑,分别找出含A、含B、含C的ID,再取三者的交集:
SELECT id FROM your_table WHERE value = 'A' INTERSECT SELECT id FROM your_table WHERE value = 'B' INTERSECT SELECT id FROM your_table WHERE value = 'C';
说明
INTERSECT关键字会保留同时出现在三个子查询中的ID,逻辑直观易懂- 注意部分数据库(比如MySQL)不支持
INTERSECT,这种情况可以用IN子句替代:
SELECT id FROM your_table WHERE value = 'A' AND id IN (SELECT id FROM your_table WHERE value = 'B') AND id IN (SELECT id FROM your_table WHERE value = 'C');
方法3:自连接查询法
通过多次自连接,把同一个ID下的A、B、C记录关联起来:
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';
说明
- 三次关联确保同一个ID下同时存在A、B、C三条记录
DISTINCT用于避免结果出现重复ID(如果表中id+value是唯一组合,可省略)
内容的提问来源于stack exchange,提问作者Arrajj
相关产品推荐
相关产品推荐

