SQL需求:筛选Type为Op且Code仅关联Op的记录
搞定这个需求其实很清晰,我们要留的是Type为'Op'的记录,但得确保同一个用户(Name)和同一个Code的组合里,没有Type为'Com'的记录。给你两种常用的实现方式:
方法1:用NOT EXISTS子查询(最直观)
SELECT t1.* FROM your_table t1 WHERE t1.Type = 'Op' AND NOT EXISTS ( -- 检查当前Name+Code组合是否存在Com类型的记录 SELECT 1 FROM your_table t2 WHERE t2.Name = t1.Name AND t2.Code = t1.Code AND t2.Type = 'Com' );
逻辑解释:
- 先在外层把所有
Type='Op'的记录捞出来 - 对每条Op记录,子查询去查同一个用户同一个Code下有没有Com的记录
- 如果查不到(也就是
NOT EXISTS为真),就把这条Op记录留下来
方法2:用分组筛选+关联查询
如果偏好先筛选出合法的Name+Code组合再查数据,可以用CTE来实现:
WITH valid_name_code AS ( SELECT Name, Code FROM your_table GROUP BY Name, Code -- 确保这个组合下只有Op类型的记录 HAVING COUNT(DISTINCT Type) = 1 AND MAX(Type) = 'Op' ) SELECT t.* FROM your_table t JOIN valid_name_code vnc ON t.Name = vnc.Name AND t.Code = vnc.Code WHERE t.Type = 'Op';
逻辑解释:
- 先通过CTE找出所有
Name+Code组合里,只存在Type='Op'的条目(分组后不同Type的数量是1,且这个Type是Op) - 再把原表和这个合法组合表关联,筛选出Op类型的记录就行
这两种方法跑你的示例数据,都能得到你想要的结果。如果数据库里数据量比较大,给Name和Code加个联合索引,能让查询速度更快。
内容的提问来源于stack exchange,提问作者john
相关产品推荐
相关产品推荐

