按页取得数据

来源:互联网 发布:东华软件经营现金流 编辑:程序博客网 时间:2024/05/24 05:46

有两种写法,内容在SQL Server 2005下测试通过

 

基础表信息:

CREATE TABLE [dbo].[Student](
 [ID] [int] IDENTITY(1,1) NOT NULL,
 [Name] [nchar](20) COLLATE Chinese_PRC_CI_AS NULL,
 [Age] [int] NULL,
 [RegisterTime] [datetime] NULL,
 CONSTRAINT [PK_Student] PRIMARY KEY CLUSTERED
(
 [ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

方法1):

declare @pageNum int
declare @pageSize int
set @pageNum = 2
set @pageSize = 10

select Top (@pageSize) * from Student where ID not in (select top (@pageSize* (@pageNum -1)) ID from Student order by ID) order by ID

 

方法2)

declare @pageNum int
declare @pageSize int
set @pageNum = 2
set @pageSize = 10

select * from
 (select top(@pageSize) *
  from (select top (@pageSize* @pageNum) * from Student order by ID) T1
  order by T1.ID desc) T2
    order by T2.ID

 

方法1)的思路是先排序后取出前PageNum-1页的数据,然后再取得不包含其中的哪些数据,排序后取得前PageSize的数据

方法2)的思路是正向排序后,先取得前PageSize *PageNum页的数据,然后再逆向排序后,取得前PageSize的数据,然后再正向排序。

 

语法注意点:

1)Sqlserver中使用TOP N是,如果N是一个常数,如 TOP 10 ,则可以不用加括号。 否则,如果是一个 表达式 如 TOP (10*2) 或者 TOP(@PageSize*@PageNum) 则 必须加括号,否则编译不通过

2)多级嵌套时,必须为临时表创建一个别名,因为order by ID 这时候是认不出来的,必须要加上别名前缀。 参照方法二中的写法

原创粉丝点击