私はあなたの問題を理解していると思います。professions
あなたの値で呼び出されるmap_vals
テーブルと、ルックアップ値を含むテーブルを作成しました。それから私はこれを思いついた:
select p.range as `range1`, p.profession, v.value from professions p
inner join map_vals v ON v.value >= p.range
where p.range =
(select max(p3.range) from professions p3 where p3.range <= v.value)
order by v.value
これらの値を指定すると...
value
29
0
60
1
23
54
戻り値
range1 profession value
0 Office Worker 0
0 Office Worker 1
23 Construction 23
23 Construction 29
54 Medical 54
54 Medical 60
編集:
manfred-sorgで示されているように CROSS APPLY を使用することもできますが、 or が必要でORDER BY DESC
、次の結果が得られます。
select v.Value, p.Profession
from tblValues v
cross apply
(select top(1) pr.Profession
from tblProfessionRanges pr
where pr.Range <= v.Value) p
生産する
Value Profession
----------- --------------------------------------------------
29 Office Worker
1 Office Worker
60 Office Worker
目的の結果を得るには、次のように変更する必要があります。
select v.Value, p.Profession
from tblValues v
cross apply
(select top(1) pr.Profession
from tblProfessionRanges pr
where pr.Range <= v.Value ORDER BY pr.[Range] DESC) p
Value Profession
----------- --------------------------------------------------
29 Construction
1 Office Worker
60 Medical
ただし、ここで必要な並べ替えにより、 を使用するよりも効率が低下しMAX
ます。