SQL中按同ID的TYPE条件排除特定行的实现需求
实现特定规则的SQL结果过滤
原始数据
| ID | TYPE |
|---|---|
| 1 | 10 |
| 1 | 20 |
| 1 | 30 |
| 1 | 40 |
| 2 | 10 |
| 2 | 20 |
| 2 | 40 |
需求
仅当同一ID下不存在TYPE=30的行时,才排除TYPE=40的行:
- ID=1同时存在TYPE=30和TYPE=40,保留所有行
- ID=2没有TYPE=30,移除其TYPE=40的行
期望结果
| ID | TYPE |
|---|---|
| 1 | 10 |
| 1 | 20 |
| 1 | 30 |
| 1 | 40 |
| 2 | 10 |
| 2 | 20 |
子查询过滤方案
假设原始查询的结果集名为original_data,可以用以下SQL语句实现过滤:
写法一:使用EXISTS子查询
SELECT od.ID, od.TYPE FROM original_data od WHERE NOT ( od.TYPE = 40 AND NOT EXISTS ( SELECT 1 FROM original_data od_sub WHERE od_sub.ID = od.ID AND od_sub.TYPE = 30 ) );
写法二:先统计ID的TYPE标记再关联
SELECT od.ID, od.TYPE FROM original_data od JOIN ( SELECT ID, MAX(CASE WHEN TYPE = 30 THEN 1 ELSE 0 END) AS has_type_30 FROM original_data GROUP BY ID ) id_status ON od.ID = id_status.ID WHERE NOT (od.TYPE = 40 AND id_status.has_type_30 = 0);
逻辑说明
两种写法核心逻辑一致:
- 当某行是
TYPE=40,且对应的ID下没有TYPE=30的记录时,排除该行 - 其他所有情况(非TYPE=40的行,或TYPE=40但对应ID存在TYPE=30的行)全部保留
内容的提问来源于stack exchange,提问作者Samir Amanov
相关产品推荐
相关产品推荐

