slq server查询获取上一条下一条数据

啾啾我 2016-12-27 02:05:41

select top 1 Id from Product where Id<19748
UNION
select top 1 Id from Product where Id>19748


SELECT Id
FROM ( SELECT [Id] ,
ids = ROW_NUMBER() OVER (ORDER BY Id DESC )
FROM Product
) a
WHERE Id =19748
ORDER BY Id DESC;

因为要考虑到是否是第一条或最后一条数据的情况,具体怎么实现,我想用一条语句实现实现上一条,当前数据,下一条,一次显示结果,n+1,n,n-1,固定位置数据行数3行。如果是第一条数据上一条Id就为0,最后一条数据,下一行就为0,具体怎么实现。
...全文
273 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
中国风 2016-12-27
  • 打赏
  • 举报
回复
引用 7 楼 sossos555 的回复:
[quote=引用 6 楼 roy_88 的回复:] SQL 2012以上版本可用以上函数去实现,取值前后行ID
我第的是2008的,LAG识别不了,能帮忙写个2008支持的吗?[/quote] e.g.
;WITH product(id,name)
AS
(
select 10,N'你' union all
select 11,N'我' union all
select 13,N'他' union all
select 17,N'她' union all
select 20,N'它'
),CTET
AS
(
SELECT id=0,name='',RN=0
UNION ALL 
SELECT *,ROW_NUMBER()OVER(ORDER BY id) AS RN FROM product
UNION ALL 
SELECT ID=0,name='',COUNT(*)+1 FROM product
)
SELECT id,t.name FROM CTET AS t WHERE EXISTS(SELECT 1 FROM CTET WHERE id=10 AND ABS(RN-t.RN)<=1)
/*
id	name
0	
10	你
11	我
*/
啾啾我 2016-12-27
  • 打赏
  • 举报
回复
引用 6 楼 roy_88 的回复:
SQL 2012以上版本可用以上函数去实现,取值前后行ID
我第的是2008的,LAG识别不了,能帮忙写个2008支持的吗?
中国风 2016-12-27
  • 打赏
  • 举报
回复
SQL 2012以上版本可用以上函数去实现,取值前后行ID
中国风 2016-12-27
  • 打赏
  • 举报
回复
e.g.

;WITH product(id,name)
AS
(
select 10,N'你' union all
select 11,N'我' union all
select 13,N'他' union all
select 17,N'她' union all
select 20,N'它'
)

SELECT 
*
FROM (SELECT id,LAG(id,1,0)OVER(ORDER BY id) AS 前一行ID,LEAD(id,1,0)OVER(ORDER BY id) AS 后一行ID   FROM Product ) AS t
WHERE Id=10

/*
id	前一行ID	后一行ID
10	0	11
*/
中国风 2016-12-27
  • 打赏
  • 举报
回复
e.g.
;WITH product
AS
(
SELECT 1 AS id
UNION ALL
SELECT 100 
UNION ALL
SELECT 19748
UNION ALL
SELECT 20000
UNION ALL
SELECT 30000)

SELECT 
*
FROM (SELECT id,LAG(id)OVER(ORDER BY id) AS 前一行,LEAD(id)OVER(ORDER BY id) AS 后一行   FROM Product ) AS t
WHERE Id=19748

/*
id	前一行	后一行
19748	100	20000
*/
啾啾我 2016-12-27
  • 打赏
  • 举报
回复
引用 1 楼 wmxcn2000 的回复:
楼主给出一些数据,和你想要的结果;
不管我怎么查询都会显示3行,第一行就是当前查询的上一条数据,第二行为当前数据,第三行为当前查询的下一条数据, 当没有数据的时候就为该列值为0,前台我可以判断处理
啾啾我 2016-12-27
  • 打赏
  • 举报
回复
引用 1 楼 wmxcn2000 的回复:
楼主给出一些数据,和你想要的结果;
例如 产品表 Id Name 10 你 11 我 13 他 17 她 20 它 当我想查询Id=10这条数据的话 ,结果是 0,10,11 其中0表示没有数据 当我查询 id =20这条数据的话,结果是 17,,20,0 当我查询 id=13这条数据的话,结果是 11,13,17
卖水果的net 2016-12-27
  • 打赏
  • 举报
回复
楼主给出一些数据,和你想要的结果;
软件介绍: SybaseToad v8.0.0.10数据库维护管理小工具,能够以树状结构保存sql语句,查询、修改数据表方便快捷。本版本解决了在使用时出现2012年6月1日后过期的问题,且不需要安装,直接打开主程序即可使用。主界面分为SQL视图区,数据数据对象察看区,存储过程视图区,数据管道视图和文本FTP视图主界面分为SQL视图区:    该视图主要执行SQL语句和自定义的快捷命令SLQ,具体功能察看该区说明。 数据数据对象察看区    该视图主要察看数据库中当前用户的表,索引和数据内容。具体功能察看该区说明。 存储过程视图区    该视图主要察看修改,执行存储过程。具体功能察看该区说明。 数据管道视图    该视图主要进行数据库之间表数据的倒换,和数据库比较等功能。具体功能察看该区说明。 文本FTP视图    1,定义FTP连接,可以通过ftp直接打开,保存服务器端的文本文件。    2,上传,下载。    具体功能察看该区说明。特性1:可以通过多种方式连接多种数据库        连接方式有ado,oracle直连(不需要安装oracle客户端),borland bde连接        连接ORACLE,SYBASE,SQL SERVER,ACCESS(正在扩充中)特性2:可以自定义多种快捷的命令和语句。        在sql视图区可以定义常用sql快捷,命令快捷,右键快捷,以及知识库。特性3:可以方便的察看修改数据库对象,包括表对象,存储过程对象等。特性4:可以通过ftp功能方便的对ftp服务器端的文件进行查看,编辑,修改,保存。        同时该功能还可以提供文件的上传下载。特性5:通过数据库通道可以对两个数据库的表的数据进行导入导出。特性6:可以比较两个数据库中的表对象和字段对象的不同之处。同时打印结果报告。特性7:带外部工具SQLloader脚本和命令生成器,以及sybase数据库的bcp命令生成器。  基本操作如下:1,执行选中的文本(快捷方式:F9或ctrl E) 2,执行当前行SQL语句(快捷方式:ctrl 回车) 3,执行带事务,点击工具按钮。完毕后,有一个提交和回滚按钮。 4,SQL视图区点击右键可以看到更多的功能。 5,显示数据库中当前用户的所有表,输入'SELECT * FROM '后会自动显示一个列表。或按ctrl K强制显示该列表。 6,按ctrl J,显示快捷输入。用户可以自己定义自己常用的快捷输入。 7,对于查找出的结果可以执行记录条数,导出,保存,拷贝列名等操作。可执行如下操作:1,执行选中的文本(快捷方式:F9或ctrl E) 2,执行当前行SQL语句(快捷方式:ctrl 回车) 3,执行带事务,点击工具按钮。完毕后,有一个提交和回滚按钮。 4,SQL视图区点击右键可以看到更多的功能。 5,显示数据库中当前用户的所有表,输入'SELECT * FROM '后会自动显示一个列表。或按ctrl K强制显示该列表。 6,按ctrl J,显示快捷输入。用户可以自己定义自己常用的快捷输入。 7,对于查找出的结果可以执行记录条数,导出,保存,拷贝列名等操作。执行DDL语句需要在无事务状态下执行,请选择菜单数据库->事务->无事务状态

590

社区成员

发帖
与我相关
我的任务
社区描述
提出问题
其他 技术论坛(原bbs)
社区管理员
  • community_281
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧