我想我理解你的问题。我创建了一个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
编辑:
您也可以使用 CROSS APPLY,如manfred-sorg所示,但它需要一个,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
.