内部连接2个表由2个类别和多个列组成

时间:2013-05-26 14:21:32

标签: sql inner-join

我有2个表:CandidatesJobs

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)。

希望这很清楚......

2 个答案:

答案 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