首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

问个有挑战性的SQL语句。该如何解决

2012-03-13 
问个有挑战性的SQL语句。用一句SQL语句,把指定ID的前一条与后一条记录取出来。如:ID cont111abc222ccc333ccd

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

热点排行