首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

SQL Compact 3.5 下多条件排序分页查询该怎么做

2014-01-22 
SQL Compact 3.5 下多条件排序分页查询该如何做?目前项目中用到的是 SQL Compact 数据库 版本是 3.5,表结

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 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

热点排行