按页取得数据

有两种写法,内容在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 这时候是认不出来的,必须要加上别名前缀。 参照方法二中的写法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值