昨天遇到了一个问题,就是如何取出SQL Server / Access数据表中中间的部分记录,例如要取出第9条到第16条的“最新”文章记录,仔细考虑了一下得到了一种方法,下面的代码示例都以下面的表结构为准:

 

  Articles 表 SQL Server 类型 Oracle 类型
PK Id int (自增) number(9) (插入时在当前最大值上加1)
  Author nvarchar(10) nvarchar2(10)
  Title nvarchar(50) nvarchar2(50)
  PubTime datetime date

这种方法是“拼凑” SQL 语句:用两次 TOP 命令取得我们所要的数据,例如:

 1如何取出表中中间的部分记录?SELECT * FROM 
 2如何取出表中中间的部分记录?     ( 
 3如何取出表中中间的部分记录?     SELECT TOP 8 * FROM 
 4如何取出表中中间的部分记录?     ( 
 5如何取出表中中间的部分记录?          SELECT TOP 16 * 
 6如何取出表中中间的部分记录?          FROM Articles 
 7如何取出表中中间的部分记录?          ORDER BY PubTime DESC 
 8如何取出表中中间的部分记录?     ) 
 9如何取出表中中间的部分记录?     ORDER BY PubTime ASC 
10如何取出表中中间的部分记录?
11如何取出表中中间的部分记录?ORDER BY PubTime DESC 

这个的想法就是“掐头去尾”,要取出按时间降序排列的第9到第16条这8条记录,首先先按时间降序取出前16条记录,由于这16条记录的后8条正是我们需要的记录,所以再对这16条记录按时间升序排列,取出前8条,这8条正是我们需要的记录,但是排序不对,最后再对这8条记录按时间降序排列,正好得到需要的记录和排序方式。
其实,取出中间数据的方法还有很多,这和分页的原理差不多,在网上还发现使用存储过程来实现的,这一种方式是以 ASP.NET Forum 为代表的、“临时表”方法:即在存储过程中建立一个临时表,该临时表包含一个序号字段(1,2,3,....)以及表的主键(其他能够唯一确定一行记录的字段也是可以的)字段。存储过程可能如下:

 1如何取出表中中间的部分记录?CREATE Procedure GetAllArticles_Paged
 2如何取出表中中间的部分记录?(
 3如何取出表中中间的部分记录?     @PageIndex int,
 4如何取出表中中间的部分记录?     @PageSize int,
 5如何取出表中中间的部分记录?     @TotalRecords out int,
 6如何取出表中中间的部分记录?     @TotalPages out int
 7如何取出表中中间的部分记录?)
 8如何取出表中中间的部分记录?AS
 9如何取出表中中间的部分记录?
10如何取出表中中间的部分记录?DECLARE @PageLowerBound int
11如何取出表中中间的部分记录?DECLARE @PageUpperBound int
12如何取出表中中间的部分记录?
13如何取出表中中间的部分记录?-- Set the page bounds
14如何取出表中中间的部分记录?SET @PageLowerBound = @PageSize * @PageIndex
15如何取出表中中间的部分记录?SET @PageUpperBound = @PageLowerBound + @PageSize + 1
16如何取出表中中间的部分记录?
17如何取出表中中间的部分记录?-- Create a temp table to store the select results
18如何取出表中中间的部分记录?CREATE TABLE #tmp
19如何取出表中中间的部分记录?(
20如何取出表中中间的部分记录?     RecNo int IDENTITY (11NOT NULL,
21如何取出表中中间的部分记录?     ArticleID int
22如何取出表中中间的部分记录?)
23如何取出表中中间的部分记录?
24如何取出表中中间的部分记录?INSERT INTO #tmp
25如何取出表中中间的部分记录?     SELECT [ID]
26如何取出表中中间的部分记录?     FROM Articles
27如何取出表中中间的部分记录?     ORDER BY PubTime DESC
28如何取出表中中间的部分记录?
29如何取出表中中间的部分记录?SELECT A.*
30如何取出表中中间的部分记录?FROM Articles A (nolock), #tmp T
31如何取出表中中间的部分记录?WHERE A.ID = T.ArticleID AND
32如何取出表中中间的部分记录?     T.RecNo > @PageLowerBound AND
33如何取出表中中间的部分记录?     T.RecNo < @PageUpperBound
34如何取出表中中间的部分记录?ORDER BY T.RecNo
35如何取出表中中间的部分记录?
36如何取出表中中间的部分记录?GO 

对于 Oracle 数据库,有几处不同严重妨碍了上面几个方法的实施,比如,Oracle 不支持 TOP 关键字:不过这个好像并不十分严重,因为它提供了 rownum 这个隐式游标,可以实现与 TOP 类似的功能,如:

如何取出表中中间的部分记录?SELECT TOP 10 如何取出表中中间的部分记录? FROM WHERE 如何取出表中中间的部分记录? 

要写成

如何取出表中中间的部分记录?SELECT 如何取出表中中间的部分记录? FROM 如何取出表中中间的部分记录? WHERE 如何取出表中中间的部分记录? AND rownum <= 10 

rownum 是记录序号(1,2,3...),但有一个比较麻烦的事情是:如果 SQL 语句中有 ORDER BY ... 排序的时候,rownum 居然是先“标号”后排序!这样,这个序号如果不加处理是不合乎使用需求的。

至于临时表,Oracle 的临时表和 SQL Server 的有很大不同,

 1如何取出表中中间的部分记录?SELECT * FROM 
 2如何取出表中中间的部分记录?     ( 
 3如何取出表中中间的部分记录?     SELECT A.*, rownum r 
 4如何取出表中中间的部分记录?     FROM 
 5如何取出表中中间的部分记录?          ( 
 6如何取出表中中间的部分记录?          SELECT * 
 7如何取出表中中间的部分记录?          FROM Articles 
 8如何取出表中中间的部分记录?          ORDER BY PubTime DESC 
 9如何取出表中中间的部分记录?          ) A 
10如何取出表中中间的部分记录?     WHERE rownum <= PageUpperBound 
11如何取出表中中间的部分记录?     ) B 
12如何取出表中中间的部分记录?WHERE r > PageLowerBound; 

相关文章:

  • 2021-06-25
  • 2022-01-03
  • 2022-12-23
  • 2021-05-30
  • 2021-09-13
  • 2021-06-30
  • 2021-08-07
猜你喜欢
  • 2021-12-10
  • 2021-09-17
  • 2021-07-27
  • 2021-11-21
相关资源
相似解决方案