2012-04-18 14 views
0

データベースの候補を、SQLとpl/sqlのみを使用してスキルと可用性に基づいて適切な求人情報と照合するタスクがあります。テーブルの比較

私は利用可能な候補者に空きがあることを示す次のコードを書くことができました。

マッチするスキルに基づいて候補者を現在の位置にどのようにマッチさせるかを考え出すのは苦労しています。問題のテーブルは、したがって、たとえば、私は

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

は私が間違ってダウンしている可能性を恐れていることを出力したい

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 

です私の混乱の原因となっています。

誰かが私を正しい方向に向ける手助けをすることができたらと思います。

ありがとうございました

答えて

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

ありがとうございました。 任意のposition.skilllに一致する各candidate.skillを出力します。 しかし、元の投稿の出力に表示されているように、候補が特定のポジションのすべてのスキルを満たしているかどうかを確認する必要があります。 – 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を未フォーマットのままにしておくと、他のプロセスで使用したい場合に、より便利になります。

関連する問題