求SQL 传进一个ID就是搜三行记录本行,前一行,后一行

anncesky 2007-07-13 09:20:46
传进一个ID就是搜三行记录本行,前一行,后一行
我自己写的是
(传进去值当是5)

select top 3 * from table where id<(select top 1 id from table where id>5 order by id desc) order by id desc

但是当id值是最后一行时就会出问题了改成

select top 3 * from table where id<=(select top 1 id from table where id>=5 order by id desc) order by id desc

这句冒似可以但是不是我想要的结果,我想要的是

当传入的值是第一行时,那么就只搜出1,2两行,传入值为最后一行时搜出倒数1,2行

大家有好的sql不?存储过程也行啊
...全文
749 49 打赏 收藏 转发到动态 举报
写回复
用AI写文章
49 条回复
切换为时间正序
请发表友善的回复…
发表回复
anncesky 2007-07-13
  • 打赏
  • 举报
回复
Select * From TEST Where ID In((Select Min(ID) From TEST Where ID > 5), 5, (Select Max(ID) From TEST Where ID < 5))

跟这个有区别吗?基本上差不多

对了max用的算法好像是1/2比较算法吧
top是用的什么算法?知道不?
haoyuzhou009 2007-07-13
  • 打赏
  • 举报
回复
楼上强~~
paoluo 2007-07-13
  • 打赏
  • 举报
回复
用Between這麼寫,加上IsNull的判斷是為了處理ID已經是最大或者最小的情況。

Select * From TEST Where ID Between IsNull((Select Max(ID) From TEST Where ID < 5), 5) And IsNull((Select Min(ID) From TEST Where ID > 5), 5)
anncesky 2007-07-13
  • 打赏
  • 举报
回复
算了,大概差不多了,这就这么招吧
anncesky 2007-07-13
  • 打赏
  • 举报
回复
对于记录数效多的表,查询次数绝对是重要的
paoluo 2007-07-13
  • 打赏
  • 举报
回复
anncesky() ( ) 信誉:100 Blog 加为好友 2007-07-13 10:54:34 得分: 0


求两次查询搞定代码


------------
查詢次數多少和效率之間應該沒有絕對的關係。
anncesky 2007-07-13
  • 打赏
  • 举报
回复
between怎么用?
LSHSSN 2007-07-13
  • 打赏
  • 举报
回复
如果是MS SQL 使用 “BETWEEN”
anncesky 2007-07-13
  • 打赏
  • 举报
回复
求两次查询搞定代码
anncesky 2007-07-13
  • 打赏
  • 举报
回复
楼上的意思插入时还要触发器

如果没有触发器插入时还要搜prew

但是这个不行嘀,已经有100w的记录手动写prew吗
fengyecsdn 2007-07-13
  • 打赏
  • 举报
回复
查询的时候返回 ID=@ID ID=PREW PREW=ID的三行
fengyecsdn 2007-07-13
  • 打赏
  • 举报
回复
对鱼的办法来说 这个也需要大量的比对和维护

要快 就每条记录加个字段 PREW 等于上一条的ID
anncesky 2007-07-13
  • 打赏
  • 举报
回复
可以用 date 否则那就没戏了
dcbr4 2007-07-13
  • 打赏
  • 举报
回复
技术确实高些,如果主键不是用ID这样的数字怎么办呢
anncesky 2007-07-13
  • 打赏
  • 举报
回复
鱼,是SQL版的高手啊,失敬失敬,他的让我挺满意的
oldmoon 2007-07-13
  • 打赏
  • 举报
回复
Top

回复人:paoluo(一天到晚游泳的鱼) ( ) 信誉:100 2007-07-13 10:04:26 得分:0


? try


Select * From TEST Where ID In((Select Min(ID) From TEST Where ID > 5), 5, (Select Max(ID) From TEST Where ID < 5))

--------------------
鱼,不亏是SQL版的高手
anncesky 2007-07-13
  • 打赏
  • 举报
回复
在网民提交的瞬间生成静态,所以我才尽可能的提高性能....
anncesky 2007-07-13
  • 打赏
  • 举报
回复
....有100w的记录...
fengyecsdn 2007-07-13
  • 打赏
  • 举报
回复
SELECT * FROM WHERE ID>(@ID-2) AND ID <(ID+2)

这个方式也可以改造下 用虚表把记数加到虚表中
把条件中的ID换成记数值
这样其实还是复合查询了 效率也还可以
anncesky 2007-07-13
  • 打赏
  • 举报
回复
TO 楼上
是啊这样很有局限性的~
需要表的设计比较合理
但是为了性能 和楼主的意图
改造下表也是很合适的
要不就在表外加索引表
======
表外加索引表
这是什么意思?
加载更多回复(29)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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