我有2个表:Candidates
和Jobs
。
在Jobs
中,有Profession
列和Subprofession
。
对于Candidates
中的每一行,共有8列:
Selected_Profession1, Selected_Subprofession1,
Selected_Profession2, Selected_Subprofession2,
Selected_Profession3, Selected_Subprofession3,
Selected_Profession4, Selected_Subprofession4
我想创建一个查询,选择所有职业和子职业都在Candidates
表中相应字段之一的职位。
所以我们假设我们有以下的Jobs表:
(profession subprofession) -----> (100, 200)
(100, 201)
(101, 200)
(101, 201)
以及以下候选人表:
(prof1 subprof1 prof2 subprof2 prof3 subprof3 prof4 subprof4) ---->
(100, 200, 300, 400, 100, 200, 100, 300)
(101, 200, 102, 200, 300, 200, 200, 300)
(100, 200, 300, 400, 101, 201, 100, 300)
(101, 101, 200, 200, 300, 300, 400, 400)
查询将从Jobs表中返回第1,3和4行(因为候选1具有对100,200,而候选2具有对101,200,候选3具有对101,201)。
希望这很清楚......
答案 0 :(得分:4)
您可以使用or
条件在多个字段上进行联接:
select j.*
from jobs j join
candidates c
on (j.prof = c.prof1 and j.subprof = c.subprof1) or
(j.prof = c.prof2 and j.subprof = c.subprof2) or
(j.prof = c.prof3 and j.subprof = c.subprof3) or
(j.prof = c.prof4 and j.subprof = c.subprof4);
如果你有大表,那么这方面的表现就不会很好。您可以通过使用CandidateProf
表来修复数据结构以获得更好的性能,其中每个prof / subprof对位于不同的行上。
使用您拥有的数据结构,您可以通过每个prof / subprof分组的单独连接获得更好的性能,特别是通过在该对上建立索引。问题是select
子句。所以:
select distinct j.*
from jobs j lef outer join
candidates c1
on (j.prof = c1.prof1 and j.subprof = c1.subprof1) left outer join
candidates c2
on (j.prof = c2.prof2 and j.subprof = c2.subprof2) left outer join
. . .
where c1.prof1 is not null or c2.prof1 is not null or
c3.prof1 is not null or c4.prof1 is not null
你需要删除重复项,因为一个候选人可能有多个资格。
答案 1 :(得分:0)
如果您的数据结构已规范化,则此类查询变得更加容易,您的数据库也变得更加灵活。
IE:你的桌子应该更像是
CandidateID ProfessionOrder Profession SubProfession
1 1 100 200
1 2 300 400
...
2 1 101 200
以下基于您当前数据结构的查询首先对候选/专业表进行规范化,然后加入以便证明使用规范化数据结构轻松找到解决方案。
select
candidateid
from
jobs
inner join
(
select
candidateid, prof1 as profession, subprof1 as subprofession
from candidates
union
select
candidateid, prof2 , subprof2
from candidates
union
select
candidateid, prof3 , subprof3
from candidates
union
select
candidateid, prof4 , subprof4
from candidates
) candidates
on jobs.profession = candidates.profession
and jobs.subprofession = candidates.subprofession