日期:2014-05-18  浏览次数:20587 次

问个有挑战性的SQL语句。
用一句SQL语句,把指定ID的前一条与后一条记录取出来。
如:
ID      cont
111         abc
222         ccc
333         ccd
444         afd
832         fdf
如提供ID等于333,要取出222与444来。

------解决方案--------------------
这样?

select top 1 * from 表 where id <333 order by id desc
union all
select top 1 * from 表 where id> 333
------解决方案--------------------
select t.* from 表 t where t.ID <333 not exists(select 1 from 表 where ID> t.ID and ID <333)
union all
select t.* from 表 t where t.ID> 333 not exists(select 1 from 表 where ID <t.ID and ID> 333)
------解决方案--------------------
select min(id) from table where id > '333 '
select max(id) from table where id < '333 '
------解决方案--------------------
create table T(id int,cout int)
insert into T
select 111,1 union all
select 222,2 union all
select 333,3 union all
select 444,4 union all
select 832,5


declare @id int
set @id=333
select * from
(select top 1 * from T where id <@id order by id desc ) t1
union all
select * from
(select top 1 * from T where id> @id order by id) t2

drop table T
------解决方案--------------------
如果记录多的话,有两个办法:

1。先对ID建立索引。

2。ID有没有规律,如果有的话,可以用猜测的方法先确定一个搜索的范围再找,这样会快很多。
比如,ID的之间的差距最大是200,最小是1的话。

SELECT top 403 * from table where id > 300 - 201 order by id

再用上面大家的方法查询。
------解决方案--------------------
改了一些,看这个。

如果记录多的话,可以下面两个办法一起用:

1。先对ID建立索引。

2。ID有没有规律,如果有的话,可以用猜测的方法先确定一个搜索的范围再找,这样会快很多。
比如,ID的之间的差距最大是200,最小是1的话。

SELECT * from table where id > 300 - 201 and id < 300 + 201

再用上面大家的方法查询。

------解决方案--------------------
SELECT * FROM 表 WHERE ID=( SELECT MAX(ID) FROM 表 WHERE ID < 300 )
UNION ALL
SELECT * FROM 表 WHERE ID=( SELECT MIN(ID) FROM 表 WHERE ID > 300 )

ID主键索引,应该是最快的了
------解决方案--------------------
declare @T table (id int,cout int)
insert into @T
select 111,1 union all
select 222,2 union all
select 333,3 union all
select 444,4 union all
select 832,5

declare @i int
set @i=333
select top 1 *
from (select top 1 percent* from @t where id <@i order by id desc)a
union all
select top 1 *
from (select top 1 percent* from @t where id> @i order by id asc)b