SQL SERVER中常常需要使用到SQL语句获取某条数据的上下文数据,即当前数据的上一条和下一条数据。一般都是根据数据的ID来过滤和排序。本文介绍的是在表结构没有ID的情况下,如何使用ROW_NUMBER SQL函数来获取上一条和下一条数据。
这里我们先创建一张城市表,只有一个城市名称字段(CityName):
CREATE TABLE [dbo].[City](
[CityName] [nvarchar](100) NULL
) ON [PRIMARY]
然后任意的添加8条城市的名称数据:
insert into city (cityname) values('吉林市');
insert into city (cityname) values('海口市');
insert into city (cityname) values('太原市');
insert into city (cityname) values('郑州市');
insert into city (cityname) values('长沙市');
insert into city (cityname) values('贵阳市');
insert into city (cityname) values('成都市');
insert into city (cityname) values('昆明市');
这里假设我们要取昆明市的上下文数据,即吉林市和太原市:
这里有两种实现的方法,第一种方法是使用ROW_NUMBER函数将表数据加入序列号,然后将数据保存至临时表中,在通过查询临时表的序列号来获取上下文数据。第二种方法也是使用ROW_NUMBER函数,不过这里不用临时表,而是使用WITH表达式将数据放入指定临时命名的结果集,其实这两种方法都是大同小异的。
PS:ROW_NUMBER只能在SQL SERVER 2005以上的数据库才有支持!
方法一,使用临时表+ROW_NUMBER函数获取上下文数据
--将有序列号的数据插入到临时表中
SELECT ROW_NUMBER() OVER(ORDER BY CityName ASC) AS ROWID,* INTO #TB FROM [City];
--方法一,获取吉林市的数据(即上一条)
SELECT * FROM #TB
WHERE ROWID=(SELECT TOP(1) ROWID-1 FROM #TB WHERE CityName='昆明市');
--方法一,获取太原市的数据(即下一条)
SELECT * FROM #TB
WHERE ROWID=(SELECT TOP(1) ROWID+1 FROM #TB WHERE CityName='昆明市');
阿三地方asdf
方法二,使用WITH表达式+ROW_NUMBER函数获取上一条和下一条数据
--方法二,获取吉林市的数据(即上一条)
WITH TB_Previous AS
(
SELECT ROW_NUMBER() OVER(ORDER BY CityName ASC) AS ROWID,* FROM [City]
)
SELECT * FROM TB_Previous
WHERE ROWID=(SELECT TOP(1) ROWID-1 FROM TB_Previous WHERE CityName='昆明市');
--方法二,获取太原市的数据(即下一条)
WITH TB_Next AS
(
SELECT ROW_NUMBER() OVER(ORDER BY CityName ASC) AS ROWID,* FROM [City]
)
SELECT * FROM TB_Next
WHERE ROWID=(SELECT TOP(1) ROWID+1 FROM TB_Next WHERE CityName='昆明市');
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/98352.html