0

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;

マッチングスキルに基づいて候補者をポジションにマッチングする方法を理解するのに苦労しています。問題のテーブルは

候補スキル

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

ポジションスキル

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

最初は間違った道をたどったのではないかと心配しており、それが私の混乱につながっています。

誰かが私を正しい方向に導くのを手伝ってくれれば幸いです。

ありがとう

4

2 に答える 2

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))
于 2012-04-18T20:39:15.237 に答える
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 をフォーマットしないままにしておくと、他のプロセスで使用したい場合にも便利になります。

于 2012-04-19T05:03:08.027 に答える