日期:2014-05-17  浏览次数:20623 次

问个SQL语句范围筛选的问题
表A

Id Num
0 0
1 1
2 3
3 6
4 9
5 12
6 15
num 是记录范围的
1-2 对应ID是1
3-5 对应ID是2
6-8 对应ID是3
9-11 对应ID是4
12-14 对应ID是5
15以上 对应ID是6
比如输入num为5 则输出的ID为2
输入num为6 则输出ID为3
请问这样的SQL语句怎么写?谢谢

------解决方案--------------------
直接用num跟你输入的数比较,条件为num小于等于你输入的数,然后取最大的ID

SELECT TOP 1 ID FROM tb WHERE num<=你输入的数 ORDER BY NUM DESC
------解决方案--------------------
select top 1 
from (
 select Id ,Num from table1 where num<=@param 
)
order by Num desc

没想到还有更好的方法了
------解决方案--------------------
SQL code

--> 测试数据:[test]
if object_id('[test]') is not null 
drop table [test]
create table [test]([Id] int,[Num] int)
insert [test]
select 0,0 union all
select 1,1 union all
select 2,3 union all
select 3,6 union all
select 4,9 union all
select 5,12 union all
select 6,15


--这个方法也可以,不过没这个简单
declare @min int
declare @max int
select @min=Min(num),@max=Max(num) from test
select number as [Num],
ISNULL([Id],(select max(id) from test c where c.Num<a.number)) id 
from master..spt_values a
left join test b
on a.number=b.Num
where number between @min and @max and type='p'


--你这个应该是比较简单的了,我看了执行计划
select top 1 id from test where num<=5 order by Num desc

/*
Num    id
0    0
1    1
2    1
3    2
4    2
5    2
6    3
7    3
8    3
9    4
10    4
11    4
12    5
13    5
14    5
15    6
*/

------解决方案--------------------
SQL code

--这是我刚刚写的语句的执行的扫描和读取次数
表 'test'。扫描计数 1,逻辑读取 1 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

表 'test'。扫描计数 2,逻辑读取 2 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'spt_values'。扫描计数 1,逻辑读取 2 次,物理读取 1 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

--这是你这个语句执行的的:
表 'test'。扫描计数 1,逻辑读取 1 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

从效率上讲你这个语句是最简单了了