2013-05-26 29 views
2

我有2個表格:CandidatesJobs由2個類別和多列內連接2個表格

Jobs有列ProfessionSubprofession

對於Candidates每排有8列:

Selected_Profession1, Selected_Subprofession1, 
Selected_Profession2, Selected_Subprofession2, 
Selected_Profession3, Selected_Subprofession3, 
Selected_Profession4, Selected_Subprofession4 

我想提出一個查詢,將選擇其專業和subprofession是在Candidates表中各字段的一個所有作業。

所以我們可以說我們有以下職位表:

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

查詢將返回行1,3和4從作業表(因爲候選者1具有對100,200和候選者2具有對101,200並且候選者3具有對101,201)。

希望這是很清楚......

+1

如果我是你,我會在你繼續之前規範你的數據結構。 – podiluska

回答

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 

而且您需要刪除重複項,因爲一個候選人可能具有多個資格。

+0

第二個查詢看起來不錯,只需選擇j。*,因爲OP要求作業表中的不同行使查詢更容易一些(查詢將從作業表返回第1,3和4行...)。 – sgeddes

+0

@sgeddes。 。 。謝謝你指出。我改變了解決方案,而不是候選人(在第二種情況下,你仍然需要獨特性,不過因爲多個候選人可能有資格產生多行)。 –

+0

+1看起來不錯 - 當我在評論中寫道時,我的想法截然不同。 – sgeddes

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 
+0

這需要幫助是準確的 - 所有的FROM子句在哪裏? – sgeddes

+0

@sgeddes非常正確。我的錯誤 – podiluska

+0

不用擔心 - 4個以上,然後這將看起來不錯。 – sgeddes