问个有挑战性的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