2

と の 2 つのテーブルがCandidatesありJobsます。

JobsProfessionとがありSubprofessionます。

の各行にCandidatesは、8 つの列があります。

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

テーブルのそれぞれのフィールドの 1 つに職業と副業があるすべての仕事を選択するクエリを作成したいと思い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

また、1 人の候補者が複数の資格を持っている可能性があるため、重複を削除する必要があります。

于 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 に答える