2

我有 2 张桌子:CandidatesJobs.

里面有JobsProfessionSubprofession

对于其中的每一行,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)。

希望这足够清楚......

4

2 回答 2

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

而且您需要删除重复项,因为一名候选人可能有多个资格。

于 2013-05-26T14:38:35.590 回答
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
于 2013-05-26T14:43:44.263 回答