--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を未フォーマットのままにしておくと、他のプロセスで使用したい場合に、より便利になります。
ありがとうございました。 任意のposition.skilllに一致する各candidate.skillを出力します。 しかし、元の投稿の出力に表示されているように、候補が特定のポジションのすべてのスキルを満たしているかどうかを確認する必要があります。 – amitl
大丈夫、今修正しました。私はこれがあなたのために働くと信じています。 – moleboy
ありがとう、私の問題を完璧に解決しました。私は自分の望む出力を提供するために、このコードを私の元のpl/sql関数に追加することができました。 – amitl