如何按项目筛选员工ID并排除同项目的直属经理?
解决方案
要实现按项目分组筛选员工,排除同项目内担任其他员工直属经理的人员,可以通过以下两种常用SQL写法实现:
方法1:使用NOT EXISTS子查询
这种方式逻辑直观,直接检查当前员工是否在同项目内有下属:
SELECT pe.project_num, pe.emp_id FROM project_employees pe WHERE NOT EXISTS ( -- 检查是否存在同项目内的员工,其直属经理为当前员工 SELECT 1 FROM employees e JOIN project_employees pe2 ON e.emp_id = pe2.emp_id WHERE e.mgr_id = pe.emp_id AND pe2.project_num = pe.project_num ) ORDER BY pe.project_num, pe.emp_id;
逻辑说明
- 主查询遍历所有项目员工记录
- 子查询关联员工表和项目员工表,确认是否存在同项目内的员工,将当前员工设为直属经理
- 若不存在这样的下属员工,则保留当前员工记录
方法2:使用LEFT JOIN + IS NULL
通过预筛选出所有"在同项目内有下属的经理",再排除这些人员:
SELECT pe.project_num, pe.emp_id FROM project_employees pe LEFT JOIN ( -- 先找出每个项目中,担任同项目员工直属经理的人员 SELECT pe2.project_num, e.mgr_id FROM employees e JOIN project_employees pe2 ON e.emp_id = pe2.emp_id ) project_mgrs ON pe.project_num = project_mgrs.project_num AND pe.emp_id = project_mgrs.mgr_id -- 保留不在"同项目经理列表"中的员工 WHERE project_mgrs.mgr_id IS NULL ORDER BY pe.project_num, pe.emp_id;
逻辑说明
- 子查询先提取所有"有下属在同项目的经理ID"及其所属项目
- 将项目员工表与该子查询结果左连接,未匹配到的记录即为非经理(或同项目无下属的经理),符合需求
验证结果
针对你的样本数据,两种写法都会返回:
project_num | emp_id ------------|------- 1 | e1 1 | e2 4 | e5 4 | e7
内容的提问来源于stack exchange,提问作者CuriousJoe
相关产品推荐
相关产品推荐

