如何通过SQL查询满足全部技能要求的员工列表?
筛选满足所有岗位技能要求的员工(SQL实现方案)
完全可以仅通过SQL查询实现这个需求,下面结合你给出的示例场景,提供两种可行的实现方式。先假设两张表的结构及示例数据如下:
-- 岗位技能要求表:存储岗位对各技能的最低等级要求 CREATE TABLE job_skill_requirements ( skill_id VARCHAR(50), min_level INT ); -- 插入示例要求:技能1≥2,技能2≥3 INSERT INTO job_skill_requirements VALUES ('技能1', 2), ('技能2', 3); -- 员工技能表:存储每位员工的技能掌握等级 CREATE TABLE employee_skills ( employee_id VARCHAR(50), skill_id VARCHAR(50), skill_level INT ); -- 插入示例员工数据(仅员工2满足所有要求) INSERT INTO employee_skills VALUES ('员工1', '技能1', 1), ('员工1', '技能2', 3), ('员工2', '技能1', 2), ('员工2', '技能2', 3), ('员工3', '技能1', 3), ('员工3', '技能2', 2);
方法1:分组统计 + HAVING子句
思路
先关联两张表,筛选出员工满足对应技能要求的记录;再按员工分组,统计该员工满足要求的技能数量。只有当满足要求的技能数量等于岗位要求的技能总数时,才说明该员工完全达标。
SQL代码
SELECT es.employee_id FROM employee_skills es JOIN job_skill_requirements jsr ON es.skill_id = jsr.skill_id AND es.skill_level >= jsr.min_level GROUP BY es.employee_id HAVING COUNT(DISTINCT es.skill_id) = (SELECT COUNT(*) FROM job_skill_requirements);
说明
COUNT(DISTINCT es.skill_id)避免同一位员工的同一项技能被重复统计- 子查询
(SELECT COUNT(*) FROM job_skill_requirements)获取岗位要求的技能总数,两者相等则说明员工满足所有要求
方法2:反向排除法(NOT EXISTS)
思路
找出所有不存在未达标技能的员工——如果某员工没有任何一项技能达不到岗位要求,也没有遗漏岗位要求的技能,就说明他完全符合条件。
SQL代码
SELECT DISTINCT es.employee_id FROM employee_skills es WHERE NOT EXISTS ( SELECT 1 FROM job_skill_requirements jsr LEFT JOIN employee_skills es2 ON es2.employee_id = es.employee_id AND es2.skill_id = jsr.skill_id WHERE es2.skill_level < jsr.min_level OR es2.skill_id IS NULL -- 排除未掌握某要求技能的员工 );
说明
子查询会定位到员工未达标或未掌握的技能,若不存在这样的记录,则该员工满足所有岗位技能要求。
内容的提问来源于stack exchange,提问作者Bear
相关产品推荐
相关产品推荐

