如何编写SQL查询从单表筛选仅m、仅EBB及两者均有的数据
单表分类查询解决方案
原始数据表
| id | name | product |
|---|---|---|
| 1 | sai | m |
| 2 | sai | EBB |
| 3 | sri | m |
| 4 | ram | m |
| 5 | sita | EBB |
| 6 | siva | EBB |
1. 查询仅拥有product='m'的记录
使用NOT EXISTS筛选出没有对应EBB产品的用户记录:
SELECT t1.* FROM your_table t1 WHERE t1.product = 'm' AND NOT EXISTS ( SELECT 1 FROM your_table t2 WHERE t2.name = t1.name AND t2.product = 'EBB' );
预期结果:
| id | name | product |
|---|---|---|
| 3 | sri | m |
| 4 | ram | m |
2. 查询仅拥有product='EBB'的记录
逻辑与上述类似,筛选出没有对应m产品的用户记录:
SELECT t1.* FROM your_table t1 WHERE t1.product = 'EBB' AND NOT EXISTS ( SELECT 1 FROM your_table t2 WHERE t2.name = t1.name AND t2.product = 'm' );
预期结果:
| id | name | product |
|---|---|---|
| 5 | sita | EBB |
| 6 | siva | EBB |
3. 查询同时拥有m和EBB的记录
方法一:使用EXISTS关联验证
SELECT t1.* FROM your_table t1 WHERE EXISTS ( SELECT 1 FROM your_table t2 WHERE t2.name = t1.name AND t2.product = CASE WHEN t1.product = 'm' THEN 'EBB' ELSE 'm' END );
方法二:分组筛选后关联
先通过分组找出同时拥有两种产品的用户,再关联原表获取完整记录:
SELECT t.* FROM your_table t JOIN ( SELECT name FROM your_table WHERE product IN ('m', 'EBB') GROUP BY name HAVING COUNT(DISTINCT product) = 2 ) AS grouped ON t.name = grouped.name;
预期结果:
| id | name | product |
|---|---|---|
| 1 | sai | m |
| 2 | sai | EBB |
内容的提问来源于stack exchange,提问作者Sri Harsha
相关产品推荐
相关产品推荐

