基于条件过滤数据:筛选拥有Rank R1且无Rank C1、C2的员工
筛选拥有R1但从未持有C1/C2的员工
我来帮你搞定这个筛选需求!核心思路是先锁定有R1等级的员工,再剔除掉那些曾经拿过C1或C2的人。下面给你两种常用的SQL实现方式,都能满足需求:
方法一:使用NOT EXISTS子查询
这是逻辑最直观的写法,直接检查员工是否存在C1/C2的记录:
SELECT DISTINCT e.Id, e.ECode, e.Name FROM employee e WHERE e.Rank = 'R1' AND NOT EXISTS ( SELECT 1 FROM employee e2 WHERE e2.ECode = e.ECode AND e2.Rank IN ('C1', 'C2') );
逻辑解释
- 外层查询先抓取所有带有
R1等级的员工记录,用DISTINCT避免同一个员工重复出现; - 内层的
NOT EXISTS会检查当前员工是否有过C1或C2的等级记录,如果有,就把这个员工排除在外。
方法二:使用LEFT JOIN + IS NULL
这种写法通过自连接来筛选无匹配的记录:
SELECT DISTINCT e.Id, e.ECode, e.Name FROM employee e LEFT JOIN employee e2 ON e.ECode = e2.ECode AND e2.Rank IN ('C1', 'C2') WHERE e.Rank = 'R1' AND e2.Id IS NULL;
逻辑解释
- 将员工表和自身做左连接,关联条件是员工编号相同,且关联表的等级是
C1或C2; - 过滤出主表中等级为
R1,且关联表没有匹配记录(e2.Id IS NULL)的员工——这就意味着该员工从未持有过C1或C2等级。
测试结果
根据你提供的数据表,最终符合条件的员工是:
- Id: 2, ECode: EMP2, Name: BB
- Id: 13, ECode: EMP4, Name: DD
内容的提问来源于stack exchange,提问作者Rahul
相关产品推荐
相关产品推荐

