4

这是一个棘手的问题,我一直无法解决。我正在使用 SQL Server 2008,并且我有一个稀疏范围表,如下所示:

Range     Profession
-----     ----------
0         Office Worker
23        Construction
54        Medical

然后我有另一个表,其中的值在这些范围内。我想构建一个连接这两个表的查询,并为我提供小于或等于给定值的 Profession 值。所以假设我的另一张桌子是这样的:

Value
29
1
60

然后我希望我的加入返回:

Value     Profession
-----     ----------
29        Construction
1         Office Worker
60        Medical

(因为 29> 23 代表建筑,但 <= 54 代表医疗)

有什么方法可以让 SQL 以这种方式屈从于我的意愿,而不是实际吹出范围表以包含所有可能的值?

谢谢你。

4

3 回答 3

4

执行此操作的简单方法是在稀疏范围表中添加另一列。

LowRange       HighRange      Profession
   0              22         Office Worker
  23              53          Construction
  54            999999         Medical

然后使用这样的查询来获取范围(表 2 是具有 29、1、60 值的那个):

SELECT Table_2.JoinKey as Value, Table_1.Description as Profession 
  FROM Table_1 INNER JOIN Table_2 
          ON Table_2.JoinKey => Table_1.LowRangeKey 
             AND Table_2.JoinKey <= Table_1.HighRangeKey;
于 2011-06-09T01:50:11.763 回答
3

您可以使用交叉应用:

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

它应该比使用 max 更快,并且不需要维护 max-range。

于 2011-06-09T11:05:59.177 回答
2

我想我理解你的问题。我创建了一个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.

于 2011-06-09T03:32:17.883 回答