下面的示意图。基本上,最底层是技能,然后是工作,然后是应聘者(暂时忽略公司)。每个技能可以与多个职位相关联,并且一个职位可以具有多个技能。每个职位都适用于一个候选人,该候选人可以拥有(拥有)多个(历史性)职位,每个职位由一个公司组成。
我只是不知道要查找所有技能X的候选人。
实际上,它变得复杂,因为X不仅是单个技能,还可以是多个技能,并且具有布尔运算符,例如
使用(skill =“ C ++” and skill =“ UML”)和NOT(skill =“ Python”)查找所有候选人
其中(skill="C++" and skill="UM"L) and NOT(skill="Python")
部分是一个字符串,应该包含一个有效的SQl子查询,但是我无法弄清查询的其余部分。
[更新]当我说“如”时,我并不是指该查询字符串。我试图找到一种方法来处理任何查询字符串的技能。例如skill=VB
或skill=VB and skill=C
或skillFreeRTOS and not skill=Windows
顺便说一句,该模式来自this question的答案,对我来说不错,但是...
答案 0 :(得分:1)
使用(skill =“ C ++” and skill =“ UML”)和NOT(skill =“ Python”)查找所有候选人
我会推荐group by
和having
。
select j.candidate_id
from jobs j join
skills s
on j.job_id = s.job_id join
skill_names sn
on sn.skill_id = s.skill_id
group by j.candidate_id
having sum(s.skill_name = 'C++') > 0 and
sum(s.skill_name = 'UML') > 0 and
sum(s.skill_name = 'Python') = 0;
需要注意的是,这使技能与职位相关,而不是直接与求职者相关。也许这是您定义技能的必要条件,但很可能您根本没有某些应聘者的某些技能的工作。
答案 1 :(得分:0)
也许是这样(未经编辑器测试)
select distinct c.candidate_id
from candidates c
where
exists (
select 1
from skill_names sn
join skills s
on sn.skill_id=s.skill_id
join jobs j
on s.job_id=j.job_id
and j.candidate_id=c.candidate_id
where sn.skill_name='C++'
) and
exists (
select 1
from skill_names sn
join skills s
on sn.skill_id=s.skill_id
join jobs j
on s.job_id=j.job_id
and j.candidate_id=c.candidate_id
where sn.skill_name='UML'
) and
not exists (
select 1
from skill_names sn
join skills s
on sn.skill_id=s.skill_id
join jobs j
on s.job_id=j.job_id
and j.candidate_id=c.candidate_id
where sn.skill_name='Phyton'
)
这里的问题是技能与应聘者无关,但与工作有关。因此,候选人本可以加入工作,但并没有透露他的真正技能。为了使查询更直接,更易理解,应将技能与候选人直接联系起来。
答案 2 :(得分:0)
可能正在使用子查询来查询Skill_name IN IN('C ++','UML')联接到Skill_name NOT IN('Python')
select c.*
from camdidates c
inner join jobs j on c.candate_id = j.candidate_id
inner join (
select sn.skill_id, sn.job_id
from skill_name sn
inner join skill s1 on s1.skill_id = sn.skill_id
and s.skill_name IN ('C++', 'UML')
inner join skill s2 on s2.skill_id = sn.skill_id
and s2.skill_name NOT IN ('Python')
) t on t.job_id = j.job_id
但是如果您想使用“ C ++”和“ UML”,则可以使用具有技能的3连接
select c.*
from camdidates c
inner join jobs j on c.candate_id = j.candidate_id
inner join (
select sn.skill_id, sn.job_id
from skill_name sn
inner join skill s1 on s1.skill_id = sn.skill_id
and s1.skill_name = 'C++'
inner join skill s3 on s1.skill_id = sn.skill_id
and s3.skill_name = 'UML'
inner join skill s2 on s2.skill_id = sn.skill_id
and s2.skill_name <> 'Python'
) t on t.job_id = j.job_id