1

두 가지 테이블을 비교하여 직무 역할에 필요한 올바른 "역량"에서 "숙련도 (기본, 중급, 고급)"가 충분한 지 확인하고 싶습니다. 각 작업의 역할은 10 개 능력이있을 것이다 그러나 나는 다음과 같은데이터베이스 테이블 행의 데이터 반복

열이있는 테이블을 생각하지 않는다 :

jobroleID, competence1proficiency1competence2proficiency2 .... competence10, proficiency10 옳은하지만 내 다른 아래 또한 열이 jobroleID 인 10 개의 행을 보여주기 때문에 잘못되었습니다.

표 1 직무 요구 사항

jobroleID, JRCompetence, JRProficiencyLevel 

001  205    intermediate 
001  207    basic 
001  301    advanced 
etc 
002   

테이블이 직원의 전류 용량

EmployeeID, EmployeeCompetence, EmployeeProficiencyLevel 
E1234  205     intermediate 
E1234  207     basic 
E1234  555     basic 
etc 

나는 여기에 대한 조언을 주셔서 감사합니다.

답변

0

기본 디자인이 좋다고 생각합니다. 행을 반복하는 것은 데이터베이스를 표준화하여 각 테이블이 엔티티에 대한 정보 만 보유하고 직원 및 역량/수준, 직무 및 역량 수준과 같은 다 대다 관계를 모델링 할 때 자연스러운 결과입니다. 이 설계로 새로운 요구 사항을 쉽게 추가 할 수 있습니다. 작업 요구 사항 테이블에 새 행을 추가하기 만하면됩니다.

새로운 기술을 추가해야 할 때마다 새로운 열을 추가하고 테이블에 의존하는 모든 쿼리를 수정해야합니다. 분명히 이상적이지는 않습니다.

그러나 숙련도 수준이 별도의 테이블에 저장되어 있으므로 순서 비교가 쉽습니다 (1 = 기본, 2 = 중간, 3 = 고급).

쿼리

는 다음과 같이 할 수있는 특정 작업에 필요한 기술을 가지고있는 직원을 찾을 수 있습니다 :

-- list emps who has can do job 001: 
SELECT EmployeeID 
FROM employee_current_capability ecc1 
WHERE NOT EXISTS (
    SELECT * 
    FROM job_role_requirements jrr 
    WHERE jrr.jobroleID = 001 
    AND NOT EXISTS (
     SELECT * 
     FROM employee_current_capability ecc2 
     WHERE ecc1.EmployeeID = ecc2.EmployeeID 
     AND ecc2.EmployeeCompetence = jrr.JRCompetence 
     AND ecc2.EmployeeProficiencyLevel >= jrr.JRProficiencyLevel 
     ) 
    ) 
GROUP BY ecc1.EmployeeID; 

은 몇 가지 예이 SQL Fiddle를 참조하십시오.

+0

주어진 속도와 정보가 우수했습니다! 정말 코드 스 니펫을 주셔서 감사합니다. 덕분에 매우 도움이되었습니다. – paul

관련 문제