2014-05-05 50 views
0

我设计了以下技巧数据库有三个表:查询一个技能数据库

  1. 员工的列名,personnelnumber
  2. 技能栏skillname,skillid
  3. skillmapping与列skillid,personnelnumber,技能水平

1)和2)只给人员和技能分配数字。 3)为员工分配技能水平。

例如,第1行表3)3 6指人与个人号码3具有技能1号的知识和知识水平为6。

我想要的是检索者谁在同一时间能熟练地

  1. 技能2知识水平3
  2. 技能4知识水平5和
  3. 技能8与知识水平2.

什么是最好的方法来做到这一点?我想先选择符合条件1)的人,然后从他们中选择符合条件2)的人,然后从结果人符合条件3)中选择。但是对于这种方法,我必须使用一些过程式编程语言来创建临时表并超越SQL。没有更好的方法吗?

回答

1

我会使用一个子查询来算技能的数量相匹配的人都有,并确保它出现三个:

SELECT name 
FROM person 
WHERE personnelnumber IN (SELECT personnelnumber 
          FROM  skillmapping 
          WHERE (skillid = 2 AND skilllevel = 3) OR 
            (skillid = 4 AND skilllevel = 5) OR 
            (skillid = 8 AND skilllevel = 2) 
          GROUP BY personnelnumber 
          HAVING COUNT(*) = 3) 
+0

你好,这将导致熟练的人在2或4或8中。但我需要的人都在同一时间熟练的三个! –

+1

您错过了'having'子句 - 没有全部三个匹配的人将不会从子查询中返回。 – Mureinik

+0

好吧,对不起:-)谢谢! –

1

QUERY(我使用EXISTS功能检查,如果该组合存在。 ..):

SELECT * FROM Employees WHERE 
EXISTS (SELECT * FROM skillmapping t2 WHERE t2.PersonnelNumber = Employees.PersonnelNumber AND SkillId = 2 AND t2.SkillLevel >= 3) --NOTE: lvl 3 or more! 
AND EXISTS (SELECT * FROM skillmapping t2 WHERE t2.PersonnelNumber = Employees.PersonnelNumber AND SkillId 4 AND t2.SkillLevel >= 5) -- NOTE: lvl 5 or more 
AND EXISTS (SELECT * FROM skillmapping t2 WHERE t2.PersonnelNumber = Employees.PersonnelNumber AND SkillId = 8 AND t2.SkillLevel >= 2) -- NOTE: lvl 2 or more 
+0

谢谢,但我读到EXISTS的使用效率很低http://www.techonthenet.com/sql/exists.php –

2

应该是一个相当直接的内连接;

SELECT e.* 
FROM employees e 
JOIN skillmapping s1 ON s1.personnelnumber = e.personnelnumber 
        AND s1.skillid = 2 
        AND s1.skillevel = 3 
JOIN skillmapping s2 ON s2.personnelnumber = e.personnelnumber 
        AND s2.skillid = 4 
        AND s2.skillevel = 5 
JOIN skillmapping s3 ON s3.personnelnumber = e.personnelnumber 
        AND s3.skillid = 8 
        AND s3.skillevel = 2