2014-05-05 91 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