目前项目中用到的是 SQL Compact 数据库 版本是 3.5,表结构如下:
create table t_PhotoVideo
(
PvId int identity(1,1) not null, -- 文件自动Id
CreateTime datetime not null, --文件属性中的创建时间
UserId int not null, --负责人Id(不关联)
UserName nvarchar(10) not null, --负责人姓名(不关联)
DevId int not null, --设备Id(不关联)
DevNo nvarchar(20) not null, --设备编号
SFilePath nvarchar(100) not null, --文件保存路径
SFileName nvarchar(50) not null, --文件名称 含扩展名
SFileType tinyint default 0 not null, --文件类型:0:照片;1:视频
VideoLenth int null, --视频长度
SFileState tinyint default 0 not null, --状态:0:正常;1:标记
ProblemId int default 0 not null, --ItemId 编号程序控制,不与T_Items 关联
FileMark nvarchar(20) null, --文件标识
FileDes nvarchar(50) null, --描述
constraint PK_PV_CFU primary key (UserId,CreateTime,DevId,SFileName)
)
go
程序中此表的查询一般是组合多条件,一般为(UserId、CreateTime、DevId、SFileType、ProblemId 这几个字段的组合),需要按照 userId 和 CreateTime 排序后,再进行分页。
由于compact3.5 不支持Row_Number(),安UserId 和 CreateTime 排序后,无法用PvId>Max(Id),因为 pvId 可能排序乱了。
起初采用用的not in 分页,利用 PvId not in ,数据量小还可以。
目前大概 30w 数据量,not in 分页就不提了,基本查不出来。多次升降序分页效果也不好,请问大家这种分页该如何做呢?
------解决方案--------------------
use master
go
set nocount on
go
set showplan_text on
go
--2012的OFFSET分页方式
select number
from spt_values
where type='p'
order by number offset 10 rows fetch next 5 rows only;
go
--2005的ROW_NUMBER分页方式
select number from (
select number,row_number() over(order by number) as num from spt_values where type='p'
) t where num between 11 and 15
order by number asc
go
--2000的TOP分页方式
select number from (
select top 5 number from (
select top 15 number from spt_values where type='p' order by number asc
) t
order by number desc
) t
order by number asc
go
set showplan_text off
go
------解决方案--------------------
给你一个例子:
declare @page_size int;
declare @page_num int;
--比如:每页10条记录
set @page_size = 10;
--比如:先取第1页
set @page_num = 1;
select *
from
(
select *,
--这里按照@@servername来排序,
--你可以根据需要按照id,sid,sname等字段来排序
(row_number() over(order by @@servername) - 1) / @page_size as pagenum
from sys.objects
)t
where pagenum = @page_num - 1