这可能是用SQL吗?

时间:2011-06-23 22:36:43

标签: mysql sql sql-server

我正在使用一个用于Skills Matrix应用程序的SQL数据库,我需要一个查询来返回符合给定位置的员工列表。以下是相关关系的简要概述:

  • 员工有很多技能 资格
  • 职位有很多 技能要求

是否有一种有效的方法可以返回具有满足特定职位要求资格的员工名单?

修改

employees
- id
- name

positions
- id
- title

skills
- id
- name

requirements
- position_id
- skill_id

qualifications
- employee_id
- skill_id

3 个答案:

答案 0 :(得分:2)

当然,这是可能的。我在那里计算七个表:员工,资格,员工资格,职位,要求,职位要求和要求资格。如果您的资格和要求 始终 为1:1(即,它们是相同的),您可以更简单地(5个表)这样做:员工,职位,技能,员工技能,职位技能。

一旦定义了表格,构建查询的技巧就是首先查找员工合格的任何职位,然后将该结果集的排除联接返回到获得结果的位置表。

答案 1 :(得分:2)

SELECT *
FROM employees e
WHERE NOT EXISTS (
    SELECT *
    FROM requirements r
    WHERE r.position_id = 1234
    AND NOT EXISTS (
        SELECT *
        FROM qualifications q
        WHERE q.skill_id = r.skill_id
        AND q.employee_id = e.employee_id
    )
)

它会找到所有员工,这样就没有任何要求没有被员工的资格填补。

MySQL Reference Maual

中甚至提到了嵌套NOT EXISTS的使用

答案 2 :(得分:1)

是的,为了达到您想要的目标,给予职位只返回那些具有共同包含职位所需技能的资格的员工。如果您检索这些员工,此列表将代表您所关注的客户列表。

<强>更新 由于我没有任何mysql经验,我的回复只涉及sql server。 尝试这样的事情:

select 
    qualifications.employee_id 
from 
    qualifications
join 
    requirements 
on 
    requirements.skill_id = qualifications.skill_id
where 
    requirements.position_id = 1234
group by 
    qualifications.employee_id
having
    count(qualifications.skill_id) = (select count(distinct skill_id) from requirements where requirements.position_id = 1234)

为每个

创建一个索引
  • employees.id
  • qualifications.employee_id
  • qualifications.skill_id
  • requirements.skill_id
  • requirements.position_id