日期:2014-05-17  浏览次数:20506 次

SQL Compact 3.5 下多条件排序分页查询该如何做?
目前项目中用到的是 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