传进一个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不?存储过程也行啊

解决方案 »

  1.   

    Declare @ID Int
    Select @ID = 5
    Select * From (Select TOP 1 * From TEST Where ID < @ID Order By ID Desc) A
    Union All
    Select * From TEST Where ID = @ID
    Union All
    Select * From (Select TOP 1 * From TEST Where ID > @ID Order By ID ) B
      

  2.   

    pid就是传进去的ID值.
    select * from table where id in (pid-1,pid,pid+1)
      

  3.   

    Declare @ID Int
    Select @ID = 5
    Select * From (Select TOP 1 * From TEST Where ID < @ID Order By ID Desc) A
    Union All
    Select * From TEST Where ID = @ID
    Union All
    Select * From (Select TOP 1 * From TEST Where ID > @ID Order By ID ) B这样的还是做了三次的查询.....
      

  4.   

    id值并不是一直+1啊还有我丢了一个要求,就是传进一个普通的id值 要搜三行的,本行,前一行,后一行
      

  5.   

    还要考虑 你的id是否连续问题。比如你输入5 数据一定有id=5的记录么???
      

  6.   


    Declare @ID Int
    Select @ID = 5
    Select * From (Select TOP 1 * From TEST Where ID < @ID Order By ID Desc) A
    Union All
    Select * From TEST Where ID = @ID
    Union All
    Select * From (Select TOP 1 * From TEST Where ID > @ID Order By ID ) B
      

  7.   

    输入的是一定有嘀,但上一行记录就不一定是4下一行记录也不一定是6Declare @ID Int
    Select @ID = 5
    Select * From (Select TOP 1 * From TEST Where ID < @ID Order By ID Desc) A
    Union All
    Select * From TEST Where ID = @ID
    Union All
    Select * From (Select TOP 1 * From TEST Where ID > @ID Order By ID ) B我的表好像有100w行不到的记录哦,三次查询跟我现在已经实现的性能差不多
      

  8.   

    建议top 1 用max(id)代替 那样速度会快很多
      

  9.   

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

  10.   

    declare  @result table(rownumber int identity(1,1),后面的与你的表结构一样)
    declare @rownumber
    select * from 你的表 into @result
    select @rownumber=rownumber where id=@id
    if @rownumber is not null
    select 你要的列 from @result where rownumber>=rownumber+1 and rownumber<=rownumber-1这样就行了
      

  11.   

    这样来ID似乎必须是数字拉
    别的数据类型恐怕难SELECT * FROM WHERE ID>(@ID-2) AND ID <(ID+2)
      

  12.   

    是 paoluo(一天到晚游泳的鱼) 可以哦
    ===================================declare  @result table(rownumber int identity(1,1),后面的与你的表结构一样)
    declare @rownumber
    select * from 你的表 into @result
    select @rownumber=rownumber where id=@id
    if @rownumber is not null
    select 你要的列 from @result where rownumber>=rownumber+1 and rownumber<=rownumber-1这样就行了
    ==============
    表有100W左右哦
      

  13.   

    fengyecsdn(以前脱了内裤才能看见屁股,现在得掰开屁股才能找见内) ( ) 信誉:98    Blog   加为好友  2007-07-13 10:13:00  得分: 0  
     
     
       这样来ID似乎必须是数字拉
    别的数据类型恐怕难SELECT * FROM WHERE ID>(@ID-2) AND ID <(ID+2)
      
     -------------
    ID不一定連續
      

  14.   

    这样来ID似乎必须是数字拉
    别的数据类型恐怕难SELECT * FROM WHERE ID>(@ID-2) AND ID <(ID+2)id是int,但是id 不是一直+1
      

  15.   

    SELECT * FROM WHERE ID>(@ID-2) AND ID <(ID+2)这个方式也可以改造下 用虚表把记数加到虚表中
    把条件中的ID换成记数值
    这样其实还是复合查询了 效率也还可以
      

  16.   

    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版的高手
      

  17.   

    鱼,是SQL版的高手啊,失敬失敬,他的让我挺满意的
      

  18.   

    可以用 date 否则那就没戏了
      

  19.   

    对鱼的办法来说 这个也需要大量的比对和维护要快 就每条记录加个字段 PREW 等于上一条的ID
      

  20.   

    查询的时候返回 ID=@ID  ID=PREW  PREW=ID的三行
      

  21.   

    楼上的意思插入时还要触发器如果没有触发器插入时还要搜prew但是这个不行嘀,已经有100w的记录手动写prew吗
      

  22.   

    如果是MS SQL 使用 “BETWEEN”
      

  23.   

    anncesky() ( ) 信誉:100    Blog   加为好友  2007-07-13 10:54:34  得分: 0  
     
     
       求两次查询搞定代码
      
     
    ------------
    查詢次數多少和效率之間應該沒有絕對的關係。
      

  24.   

    用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)
      

  25.   

    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是用的什么算法?知道不?