刚才说的分组问题不清楚,已整理好:

周围走 2007-06-26 04:55:33

表名:检测项目

项目编号 版本号 检测项目
01 1 火灾自动报警系统
0101 1 消防控制室
010101 1 消防控制室位置1
010101 2 消防控制室位置2
010101 3 消防控制室位置3
010102 1 非直接通向室外的门
010102 3 非直接通向室外的门
010103 1 门的开启方向
010103 2 门的开启方向
010104 1 送、回风管防火隔断
010104 5 送、回风管防火隔断
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"直拨电话
.....

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




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

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

1--[项目编号]不重复
2--[版本号]=5
3--如没有[版本号]是5的,取小于5的那条记录
目的就是把等于[版本号]的取出,不等于[版本号]的只取仅小于的那条记录.
...全文
194 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
昵称被占用了 2007-06-26
  • 打赏
  • 举报
回复
与其他表连接:

函数
SELECT * FROM dbo.fn_检测项目(4) a INNER 表_xx b ON a.项目编号=b.项目编号

非函数
SELECT * FROM 检测项目 a INNER 表_xx b ON a.项目编号=b.项目编号 and a.版本号=(
select top 1 版本号 from 检测项目
where 项目编号=a.项目编号
and 版本号<=4
order by 版本号 desc
)

昵称被占用了 2007-06-26
  • 打赏
  • 举报
回复
写成函数吧

create function fn_检测项目(
@版本号 int
)
returns table
as
return (

SELECT * FROM 检测项目 a
WHERE 版本号=(
select top 1 版本号 from 检测项目
where 项目编号=a.项目编号
and 版本号<=@版本号
order by 版本号 desc
)
)
go


--查询:
select * from dbo.fn_检测项目(5)

select * from dbo.fn_检测项目(2)


周围走 2007-06-26
  • 打赏
  • 举报
回复
但我还要与其他表连接呢?
SELECT * FROM 查询_x a INNER 表_xx b ON a.项目编号=b.项目编号 WHERE a.版本号=4
昵称被占用了 2007-06-26
  • 打赏
  • 举报
回复
本来就是查询

SELECT * FROM 检测项目 a
WHERE 版本号=(
select top 1 版本号 from 检测项目
where 项目编号=a.项目编号
and 版本号<=5
order by 版本号 desc
)
yrwx001 2007-06-26
  • 打赏
  • 举报
回复
那你另外的表也應該有個 版本号 字段 關聯,你把@版本号 換成那邊關聯的 版本号 就可以了
比如 要關聯的表 b(..., 版本號 varchar(1),....)
select * from b,(SELECT * FROM 检测项目 a
WHERE 版本号=(
select top 1 版本号 from 检测项目
where 项目编号=a.项目编号
and 版本号<=b.版本号
order by 版本号 desc
))C where 關聯條件
周围走 2007-06-26
  • 打赏
  • 举报
回复
?
再好用查询,不用存储过程.
就想这样子:
SELECT * FROM 查询_x a INNER 表_xx b ON a.项目编号=b.项目编号 WHERE 版本号=4

结果:
项目编号 版本号 检测项目
01 1 火灾自动报警系统
0101 1 消防控制室
010101 3 消防控制室位置3
010102 3 非直接通向室外的门
010103 2 门的开启方向
010104 1 送、回风管防火隔断 (刚才这行版本号是5,错了应该是1)
010105 1 电气线路及管路设置
010106 1 抗干扰性
010107 1 标志
010108 1 "119"直拨电话
......
周围走 2007-06-26
  • 打赏
  • 举报
回复
再好用查询,不用存储过程.
就想这样子:
SELECT * FROM 查询_x a INNER 表_xx b ON a.项目编号=b.项目编号 WHERE 版本号=4

结果:
项目编号 版本号 检测项目
01 1 火灾自动报警系统
0101 1 消防控制室
010101 3 消防控制室位置3
010102 3 非直接通向室外的门
010103 2 门的开启方向
010104 5 送、回风管防火隔断
010105 1 电气线路及管路设置
010106 1 抗干扰性
010107 1 标志
010108 1 "119"直拨电话
......
yrwx001 2007-06-26
  • 打赏
  • 举报
回复
不用游標
就1樓的正解
周围走 2007-06-26
  • 打赏
  • 举报
回复
to: Haiwer(海阔天空)
我试过你的应该是正解,但能不能做成查询呢?因为我还要与其他表连接的,用存储过程可能难实现.
RunUpwind 2007-06-26
  • 打赏
  • 举报
回复
1--[项目编号]不重复
2--[版本号]=2
3--如没有[版本号]是2的,取小于2的那条记录,上例:010102
目的就是把等于[版本号]的取出,不等于[版本号]的只取仅小于的那条记录.
-----------------------------------------
结果应该只有
010102 1 非直接通向室外的门
010103 2 门的开启方向

你所列出的结果是什么意思?
昵称被占用了 2007-06-26
  • 打赏
  • 举报
回复
declare @版本号 int
set @版本号=5


SELECT * FROM 检测项目 a
WHERE 版本号=(
select top 1 版本号 from 检测项目
where 项目编号=a.项目编号
and 版本号<=@版本号
order by 版本号 desc
)

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧