如何在SQL表的同一列使用IN应用多条件,筛选同时具备指定技能的员工

需求说明
需要查询Skill字段同时包含DBA和Data Analytics的员工的Emp_ID、姓名及对应技能记录,预期返回结果为Emp_ID 1000的2条记录、Emp_ID 1005的2条记录。
常见错误原因
直接使用Skill = 'DBA' OR Skill = 'Data Analytics'或者Skill IN ('DBA', 'Data Analytics')作为筛选条件,只会匹配到拥有任意一项技能的员工,无法保证同一个Emp_ID同时拥有两项技能,因此会把仅拥有DBA的1002、仅拥有Data Analytics的1003也纳入结果,不符合要求。
解决方案
方法1:分组聚合筛选法(兼容性最好,适用于所有SQL数据库)
先按员工ID和姓名分组,筛选出同时覆盖两项技能的员工,再关联原表返回对应的全部技能记录:
SELECT t.Emp_ID, t.Emp_Name, t.Skill FROM your_table t INNER JOIN ( SELECT Emp_ID, Emp_Name FROM your_table WHERE Skill IN ('DBA', 'Data Analytics') GROUP BY Emp_ID, Emp_Name HAVING COUNT(DISTINCT Skill) = 2 ) qualified_emp ON t.Emp_ID = qualified_emp.Emp_ID WHERE t.Skill IN ('DBA', 'Data Analytics') ORDER BY t.Emp_ID;
注:把
your_table替换为实际的表名即可。如果表中同一个员工同一项技能不会出现重复记录,可以把COUNT(DISTINCT Skill)改成COUNT(*)性能更好。
方法2:双重EXISTS判断
通过两次存在性校验,保证当前员工同时拥有两项技能:
SELECT Emp_ID, Emp_Name, Skill FROM your_table t1 WHERE Skill IN ('DBA', 'Data Analytics') AND EXISTS ( SELECT 1 FROM your_table t2 WHERE t2.Emp_ID = t1.Emp_ID AND t2.Skill = 'DBA' ) AND EXISTS ( SELECT 1 FROM your_table t3 WHERE t3.Emp_ID = t1.Emp_ID AND t3.Skill = 'Data Analytics' ) ORDER BY Emp_ID;
以上两种方法都可以精准返回符合要求的4条记录,不会混入仅拥有单一技能的员工数据。
内容的提问来源于stack exchange,提问作者Venkatesh
相关产品推荐
相关产品推荐

