SQL JOIN语句调试求助:如何同时获取员工匹配岗位要求的技能及非岗位要求技能
问题分析与解决方案
看了你的业务需求和当前的SQL语句,核心问题出在员工技能表与岗位要求表的连接逻辑上:你现在把emp_skills.skill = rqmt.requirement写在了LEFT JOIN empskill_mst的ON子句里,这直接导致只有员工技能恰好匹配某一项岗位要求时,这条技能记录才会被保留;而员工那些不属于岗位要求的技能(比如NHP-SAFE、NHP-CLCK等),因为无法匹配rqmt.requirement,会被这个连接条件过滤掉,所以你在结果里看不到它们。
另外,结果里那条NULL VISIONSC的记录,是岗位要求中存在但员工未掌握的技能,这是pos_rqmt_mst左连empskill_mst产生的空行,但根据你的需求,你并不需要这部分数据——你要的是员工已拥有的所有技能,无论是否匹配岗位要求。
修正后的SQL语句
调整连接顺序和条件,确保员工的所有技能都被保留,再关联岗位要求做匹配判断:
SELECT emp.emp_num AS 'EmployeeID', emp.name As 'Name', pos_det.dept AS 'Dept', pos.job_title AS 'Job Title', emp_skills.skill AS 'Skill', rqmt.requirement AS 'Requirement', skill.description AS 'Descript', emp_skills.skill_date AS 'Date Acquired', CASE WHEN rqmt.requirement IS NOT NULL THEN 1 ELSE 0 END AS 'Meets Requirement' FROM employee_mst AS emp -- 关联员工当前岗位信息 LEFT JOIN emp_pos_mst AS emp_pos ON emp.emp_num = emp_pos.emp_num LEFT JOIN position_mst AS pos ON emp_pos.job_id = pos.job_id LEFT JOIN pos_det_mst AS pos_det ON pos_det.job_id = emp_pos.job_id AND pos_det.job_detail = emp_pos.job_detail -- 优先获取员工所有技能,确保无遗漏 LEFT JOIN empskill_mst AS emp_skills ON emp.emp_num = emp_skills.emp_num -- 左连接岗位要求,判断当前技能是否属于岗位要求 LEFT JOIN pos_rqmt_mst AS rqmt ON emp_pos.job_id = rqmt.job_id AND emp_skills.skill = rqmt.requirement LEFT JOIN skill_mst AS skill ON skill.skill = emp_skills.skill WHERE emp.term_date IS NULL AND emp.emp_num IS NOT NULL ORDER BY emp.name
关键修正点说明
- 调整JOIN顺序:先基于
emp_num关联empskill_mst,确保员工的所有技能记录都被保留,不会被岗位要求过滤。 - 移动匹配条件:把
emp_skills.skill = rqmt.requirement移到pos_rqmt_mst的LEFT JOIN条件中,这样员工技能匹配岗位要求时,rqmt.requirement会有值,否则为NULL。 - 优化匹配判断:CASE语句通过
rqmt.requirement是否为空来标记是否符合要求,逻辑更准确。
执行这条SQL后,你就能看到员工的所有技能(包括之前缺失的NHP-SAFE、NHP-CLCK等),同时清晰标记哪些技能符合当前岗位要求。
内容的提问来源于stack exchange,提问作者Joseph Taylor
相关产品推荐
相关产品推荐

