2012-04-18 2 views
0

저는 데이터베이스의 후보자를 SQL과 pl/sql만을 사용하여 기술 및 가용성을 기준으로 적합한 직업 부족으로 대응시키는 작업을 수행하고 있습니다.PL/SQL 테이블 비교

사용 가능한 후보자와 사용 가능한 후보자를 일치시키는 다음 코드를 작성했습니다.

이제 후보자를 일치하는 기술에 따라 위치에 매치시키는 방법을 파악하는 데 어려움을 겪고 있습니다. 문제의 테이블

candidateSkills 있습니다

candidateID | skillID 
1   | 2 
1   | 3 
2   | 1 
3   | 1 
3   | 3 

positionSkills

positionID | skillID 
1   | 1 
1   | 3 
2   | 1 
3   | 2 
3   | 3 

그래서 예를 들어 내가

Candidate 1 Matches 
position 3 
Candidate 2 Matches 
position 2 
Candidate 3 Matches 
position 2 
position 3 

나는 내가 잘못 아래로 갈 수 두려워 출력하고 싶습니다 내 혼란으로 이어지는 내적 경로.

누군가가 올바른 방향으로 나를 조종하는 데 도움이된다면 고맙겠습니다.

감사합니다.

답변

1

수정되었습니다. 후보 3 일치 작업 1, 2, 후보 2 개 일치 작업이, 후보 1 개 일치 작업 테이블 구축이 스크립트를 사용하여 3

select distinct c.cid, j.jid 
from candidate c, jobs j 
where j.sid=c.sid 
and not exists 
(select 'x' from jobs j2 where j2.jid=j.jid 
and j2.sid not in (select c2.sid from candidate c2 
where c2.cid=c.cid)) 
+0

도움 주셔서 감사합니다. 쿼리는 어떤 후보와도 일치하는 후보를 출력합니다 ..skilll 그러나 원본 게시물의 출력에 표시된대로 후보가 특정 위치의 모든 스킬을 충족시키는 지 확인해야합니다. – amitl

+0

오케이, 이제 수정했습니다. 나는 이것이 당신을 위해 일할 것이라고 믿습니다. – moleboy

+0

대단히 감사합니다. 제 문제를 완벽하게 해결했습니다. 필자는 원래의 pl/sql 함수에이 코드를 사용하여 원하는 출력을 제공 할 수있었습니다. – amitl

1
--All candidates that match every skill in a position 
select distinct candidateID, positionID 
from 
(
    --Match candidates and positions, count number of skills that match 
    select candidateID, positionID, skills_per_position 
     ,count(*) over (partition by candidateID, positionID) matched_skills 
    from candidateSkills 
    inner join 
    (
     --Number of skills per position 
     select positionID, skillID 
      ,count(*) over (partition by positionID) skills_per_position 
     from positionSkills 
     where status = 'Open' 
    ) positionSkills_with_count 
     on candidateSkills.skillID = positionSkills_with_count.skillID 
    where available = 'True' 
) 
where matched_skills = skills_per_position 
order by candidateID, positionID; 

그러나

create table candidateSkills as 
select 1 candidateid, 2 skillID, 'True' available from dual union all 
select 1 candidateid, 3 skillID, 'True' available from dual union all 
select 2 candidateid, 1 skillID, 'True' available from dual union all 
select 3 candidateid, 1 skillID, 'True' available from dual union all 
select 3 candidateid, 3 skillID, 'True' available from dual; 

create table positionSkills as 
select 1 positionID, 1 skillID, 'Open' status from dual union all 
select 1 positionID, 3 skillID, 'Open' status from dual union all 
select 2 positionID, 1 skillID, 'Open' status from dual union all 
select 3 positionID, 2 skillID, 'Open' status from dual union all 
select 3 positionID, 3 skillID, 'Open' status from dual; 

을 내 결과가 약간 있습니다 다른. 후보자 3은 2와 3이 아닌 1과 2의 위치와 일치합니다.이 단어가 귀하의 예에서 오타이기를 바랍니다.

또한 내 출력을 내 것과 정확하게 포맷하지 않았습니다. SQL을 여러 줄 형식으로 결과를 표시하는 것은 약간 까다로울 수 있습니다. 그러나 SQL을 포맷되지 않은 채로두면 다른 프로세스에서 사용하려는 경우 더 유용합니다.