SQL查询:筛选所有员工均在指定ID列表中的部门
SQL筛选全下属都在指定ID列表的部门
需求背景
现有员工部门归属表,仅包含department(部门名称)、employee(员工ID)两个字段,已知每名员工仅归属1个部门。给定一组员工ID列表,需要编写SQL筛选出所有下属员工全部包含在该给定列表内的部门。
测试样例
测试表数据如下:
| Department | Employee |
|---|---|
| finance | 1 |
| finance | 2 |
| marketing | 3 |
| marketing | 4 |
| IT | 5 |
| IT | 6 |
- 给定员工ID列表:
(2,3,4,5,6) - 预期返回结果:
('marketing', 'IT') - 判定逻辑:finance部门存在员工1不在给定列表,因此被排除;marketing、IT部门的所有员工均在给定列表内,符合要求。
- 实现约束:不限制数据库类型,可使用标准SQL或任意数据库方言实现。
实现方案
方案1:分组聚合判断(全数据库兼容,推荐)
核心逻辑:按部门分组后,统计部门内不在给定ID列表的员工数量,数量为0即代表该部门所有员工都在列表中。假设表名为dept_emp,标准SQL写法如下:
SELECT department FROM dept_emp GROUP BY department HAVING SUM(CASE WHEN employee NOT IN (2,3,4,5,6) THEN 1 ELSE 0 END) = 0;
在支持布尔值隐式转数值的数据库(MySQL、PostgreSQL等)中,可以简化写法:
SELECT department FROM dept_emp GROUP BY department HAVING SUM(employee NOT IN (2,3,4,5,6)) = 0;
方案2:反选排除法
核心逻辑:先查出所有「存在员工不在给定列表」的部门,再从全量部门中排除这些部门即可:
SELECT DISTINCT department FROM dept_emp WHERE department NOT IN ( SELECT department FROM dept_emp WHERE employee NOT IN (2,3,4,5,6) );
提示:如果
employee字段存在NULL值,需要提前加WHERE employee IS NOT NULL条件过滤,避免NOT IN逻辑出现异常。
内容的提问来源于stack exchange,提问作者kakarukeys
相关产品推荐
相关产品推荐

