如果用oracle就一点都不难。
SELECT ID,
DECODE(X.ROWNUM - Y.ROWNUM, -1, '上一条记录', '下一条记录') rec_seq
FROM (SELECT ROWNUM, ID
FROM myTABLE) X,
(SELECT ROWNUM, ID
FROM myTABLE) Y
WHERE Y.ID = myID
AND (X.ROWNUM = Y.ROWNUM - 1 -- 上一条记录
OR X.ROWNUM = Y.ROWNUM + 1) -- 下一条记录但是这样做如果表很大的话会很慢的。不理解为什么要根据表的物理存储位置来查询,通常没有意义。
SELECT ID,
DECODE(X.ROWNUM - Y.ROWNUM, -1, '上一条记录', '下一条记录') rec_seq
FROM (SELECT ROWNUM, ID
FROM myTABLE) X,
(SELECT ROWNUM, ID
FROM myTABLE) Y
WHERE Y.ID = myID
AND (X.ROWNUM = Y.ROWNUM - 1 -- 上一条记录
OR X.ROWNUM = Y.ROWNUM + 1) -- 下一条记录但是这样做如果表很大的话会很慢的。不理解为什么要根据表的物理存储位置来查询,通常没有意义。
假设您的表如下:
create table mytable(id int not null primary key,col1 char(20),col2 varchar(40))
第一种方法
1.新建立临时表
create table #mytemptable(seqid int not null identity(1,1),id int not null)
insert into #mytemptable(id) select id from mytable
然后,若想取到前一条纪录的id,则
select id from #mytemptable where seqid=(select seqid from #mytemptable where id=@your_id_value) - 1
下一条纪录
则
select id from #mytemptable where seqid=(select seqid from #mytemptable where id=@your_id_value) + 1第二种方法(id 必须不同,一般应该是这样),速度可能很慢
例如,去前一个id:
select id from
(select seqid=(select count(*) from mytable t1 where t1.id<t2.id),id,name from mytable t2) kk
where seqid=
((select seqid from(select seqid=(select count(*) from mytable t1 where t1.id<t2.id),id,name from mytable t2) k where id=@your_id_value)-1)第三种方法:
利用游标,慢慢的滚,这种方法很简单
上一条记录:
SELECT ID
FROM myTABLE
WHERE SEQ_NO In (SELECT MAX(SEQ_NO)
FROM myTABLE
WHERE SEQ_NO < (SELECT SEQ_NO
FROM myTABLE
WHERE ID = myID)
);
下一条记录:
SELECT ID
FROM myTABLE
WHERE SEQ_NO In (SELECT MIN(SEQ_NO)
FROM myTABLE
WHERE SEQ_NO > (SELECT SEQ_NO
FROM myTABLE
WHERE ID = myID)
);