2012-04-18 54 views
0

我的任務是根據技能和可用性將我的數據庫中的候選人與適當的職位空缺匹配,只使用sql和pl/sql。PL/SQL比較表

我已經設法編寫了下面的代碼,將可用的候選人與可用的職位空缺相匹配。

DECLARE 
    CURSOR availableCandidates_cur IS 
     SELECT * FROM candidate 
     WHERE candidate.available = 'True'; 
    CURSOR availableJobs_cur IS 
     SELECT * 
     FROM position WHERE status = 'Open'; 
    BEGIN 
     DBMS_OUTPUT.PUT_LINE('Available Candidates with matching vacencies'); 
     FOR availableCandidates_rec IN availableCandidates_cur 
     LOOP 
     DBMS_OUTPUT.PUT_LINE('Candidate: ' || availableCandidates_rec.firstName || ' ' || availableCandidates_rec.lastName); 
     FOR availableJobs_rec IN availableJobs_cur 
     LOOP 
      IF (availableCandidates_rec.positionType = availableJobs_rec.positionType) THEN 
      DBMS_OUTPUT.PUT_LINE(availableJobs_rec.positionName); 
      END IF; 
     END LOOP; 
     END LOOP; 
END; 

我很想弄清楚現在如何根據匹配技巧來匹配候選人。有問題的表是

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場比賽工作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

感謝您的幫助。 該查詢輸出每個candidate.skill匹配任何position.skilll 但是,我需要檢查是否候選人滿足特定位置的每一個技能,以便成爲一個匹配,如顯示在原始文章的輸出。 – amitl 2012-04-18 22:13:26

+0

好的,我現在糾正了。我相信這會對你有用。 – moleboy 2012-04-19 14:05:21

+0

非常感謝您完美解決了我的問題。我設法將這些代碼加入到我的原始pl/sql函數中以提供我想要的輸出。 – amitl 2012-04-22 21:21:55

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匹配位置1和2,而不是2和3.我希望這只是你的例子中的一個錯字。

此外,我沒有完全像你的格式輸出我的輸出。讓SQL以多行格式顯示結果可能有點棘手。但是,如果您想在其他某個過程中使用SQL,那麼將SQL保留爲無格式也會使其更加有用。