日期:2014-05-19  浏览次数:20400 次

我想建立一个这样的SQL查询:

表名:检测项目

项目编号   版本号 检测项目
01 1 火灾自动报警系统
0101 1 消防控制室
010101 1 消防控制室位置1
010101 2 消防控制室位置2
010101 3 消防控制室位置3
010102 1 非直接通向室外的门1
010102 3 非直接通向室外的门2
010103 1 门的开启方向
010103 2 门的开启方向
010104 1 送、回风管防火隔断1
010104 4 送、回风管防火隔断2
010105 1 电气线路及管路设置
010106 1 抗干扰性
010107 1 标志
010108 1 "119 "直拨电话
......


上面的010101\010102\010103\010104有2到3个版本号,其余只有1个.

我想实现这样的结果:

例子1:
SELECT   *   FROM   检测项目   WHERE   版本号=2

结果:
项目编号   版本号 检测项目
01 1 火灾自动报警系统
0101 1 消防控制室
010101 2 消防控制室位置2
010102 1 非直接通向室外的门
010103 2 门的开启方向
010104 1 送、回风管防火隔断
010105 1 电气线路及管路设置
010106 1 抗干扰性
010107 1 标志
010108 1 "119 "直拨电话
.....


例子2:
SELECT   *   FROM   检测项目   WHERE   版本号=4

结果:
项目编号   版本号 检测项目
01 1 火灾自动报警系统
0101 1 消防控制室
010101 3 消防控制室位置3
010102 3 非直接通向室外的门2
010103 2 门的开启方向
010104 4 送、回风管防火隔断2
010105 1 电气线路及管路设置
010106 1 抗干扰性
010107 1 标志
010108 1 "119 "直拨电话
.......


结果说明:
1--[项目编号]不重复
2--[版本号]=2
3--如没有[版本号]是2的,取小于2的那条记录,上例:010102
目的就是把等于[版本号]的取出,不等于[版本号]的只取仅小于的那条记录.




------解决方案--------------------
create table #t (sid varchar(7),stext varchar(20))
insert #t
select '011 ', '火灾自动报警系统 ' union all
select '01011 ', '消防控制室 ' union all
select '0101011 ', '消防控制室位置1 ' union all
select '0101012 ', '消防控制室位置2 ' union all
select '0101013 ', '消防控制室位置3 ' union all
select '0101021 ', '非直接通向室外的门1 ' union all
select '0101023 ', '非直接通向室外的门2 ' union all
select '0101031 ', '门的开启方向 ' union all
select '0101032 ', '门的开启方向 ' union all
select '0101041 ', '送、回风管防火隔断1 ' union all
select '0101044 ', '送、回风管防火隔断2 ' union all
select '0101051 ', '电气线路及管路设置 ' union all
select '0101061 ', '抗干扰性 ' union all
select '0101071 ', '标志 ' union all
select '0101081 ', ' "119 "直拨电话 '

create table #t1 (sid varchar(7),stext varchar(20))


declare @sid varchar(1),@iteam varchar(10)

set @sid = '4 '
declare cur cursor for
select distinct bsid = left(sid,6) from #t
open cur
FETCH NEXT FROM cur INTO @iteam
while @@fetch_status = 0
begin
insert #t1
select top 1 * from #t where left(sid,6) = @iteam and right(sid,1) <= @sid order by sid desc
FETCH NEXT FROM cur INTO @iteam
end

CLOSE cur
DEALLOCATE cur
select * from #t1
drop table #t1
drop table #t


sid stext
------- --------------------
0101013 消防控制室位置3
0101023 非直接通向室外的?2
0101032 ?的??方向
0101044 送、回?管防火隔?2
0101051 ?气?路及管路?置
0101061 抗干扰性
0101071 ?志
0101081 "119 "直???
01011 消防控制室
011 火?自??警系?