1.使用以下语句Q但效率可能要降低一?br /> select * from 表名 b, (select top 10 主键字段,排序字段 from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a order by 排序字段 ) c where b.主键字段 = c.主键字段 order by c.排序字段 desc
2.在ado里处?记录集游标Ud最后,然后前移
''以下为asp范例
set rsTemp = Server.CreateObject("adodb.recordset")
rsTemp.Open 语句,conn,1,1
rsTemp.MoveLast
for i = 1 to rsTemp.RecordCount
'取?...
rsTemp.MovePrevious
next
l测试,以上分页Ҏ比用时表分页速度q要快,q且单易?
Ҏ二:
大数据量下的分页
对于非常大的数据模型而言Q分|索时Q每ơ都加蝲整个数据源非常浪贏V通常的选择是检索页面大的块区的数据,而非索所有的数据Q然后单步执行当前行?br /> 本文演示ASP.net的DataGrid和Sql Server 实现大数据量下的分页Qؓ了便于实现演C,数据表采用了Northwind数据库的Orders表(830条记录)?br /> 如果数据表中有唯一的自增烦引,q且q个字段没有出现断号现象。检索页面大的块区数据非常简单了。通过单的Sql语句可以实现这个功能:
select * from orders where orderid between 10248 and 10253
当然Q如果这个字D|号不是很严重Q而且允许不是很严格的按照每页条数分页Q这LҎ也是可以用的?br /> 如果q个字段断号Q或者需要按照其他条件排序分,p复杂些了。首先要获得q个面需要显C的~号Q然后再按照q个~号获得需要的块区数据。根据编可得块区数据很单。不q用下面方式获得数据排序q不是按照指定的id列表序Q这时候还要附加order by 命o?br /> select * from orders where orderid in (10248,10249,10250,10251,10252,10253) order by orderid desc
获得q个面需要显C的~号列表复杂多了,而且有多U方案:
Ҏ一Q维护一个表Q这个表记录需要显C的q些~号排序序。(q个表可以是临时表,也可以是物理表)。下面演CZ利用一个全局临时表。这个全局临时表记录需要显C的~号。注意排序,q里的order by 是需要显C的排序序?br /> create table ##temptable(iid int IDENTITY (1, 1) NOT NULL,mainid int NOT NULL)insert ##temptable(mainid) select OrderID from orders order by OrderID descselect * from ##temptabledrop table ##temptable -- 实际执行时候,删除全部临时表当然不再这里执行?br /> q个临时表存在,获得指定分页的分块数据就很简单了。看下面代码Q?br /> create table ##temptable(iid int IDENTITY (1, 1) NOT NULL,mainid int NOT NULL)insert ##temptable(mainid) select OrderID from orders order by OrderID descdeclare @PageSize int,@CurrPage int,@strSQL varchar(2000),@IDStr varchar(1000)select @PageSize = 30select @CurrPage = 2select @IDStr = ''select @IDStr = @IDStr + ltrim(rtrim(str(MainID))) + ',' from ##temptable where iid between ((@CurrPage-1)*@PageSize+1) and @CurrPage*@PageSizeif @IDStr <> '' begin select @IDStr = left(@IDStr,len(@IDStr)-1)endselect @strSQL = 'select * from orders where OrderID in ('+@IDStr+') order by OrderID desc 'exec(@strSQL)drop table ##temptable
Articles ? SQL Server cd Oracle cd PK Id int (自增) number(9) (插入时在当前最大g?) Author nvarchar(10) nvarchar2(10) Title nvarchar(50) nvarchar2(50) PubTime datetime date
SQL Server / Access {微软品中Q我们通常的自定义分页有两U思\Q?br /> 一U是?ASP.NET Forum Z表的、“时表”方法:卛_存储q程中徏立一个时表Q该临时表包含一个序号字D(1Q?Q?Q?...Q以及表的主键(其他能够唯一定一行记录的字段也是可以的)字段。存储过E可能如下:Q编?SS1Q?br />CREATE Procedure GetAllArticles_Paged ( @PageIndex int, @PageSize int, @TotalRecords out int, @TotalPages out int ) AS
DECLARE @PageLowerBound int DECLARE @PageUpperBound int
-- Set the page bounds SET @PageLowerBound = @PageSize * @PageIndex SET @PageUpperBound = @PageLowerBound + @PageSize + 1
-- Create a temp table to store the select results CREATE TABLE #tmp ( RecNo int IDENTITY (1, 1) NOT NULL, ArticleID int )
INSERT INTO #tmp SELECT [ID] FROM Articles ORDER BY PubTime DESC
SELECT A.* FROM Articles A (nolock), #tmp T WHERE A.ID = T.ArticleID AND T.RecNo > @PageLowerBound AND T.RecNo < @PageUpperBound ORDER BY T.RecNo
GO
另一U可能更适合E序中“拼凑?SQL 语句Q用两次 TOP 命o取得我们所要的分页数据Q例如:Q编?SS2Q?br />SELECT * FROM ( SELECT TOP(PageSize) * FROM ( SELECT TOP (PageSize * PageIndex) * FROM Articles ORDER BY PubTime DESC ) ORDER BY PubTime ASC ) ORDER BY PubTime DESC
q个的想法就是“掐头去䏀,q有不少分页的方法,q里׃一一列出了?br /> 对于 Oracle 数据库,有几处不同严重妨了上面几个Ҏ的实施,比如QOracle 不支?TOP 关键字:不过q个好像q不十分严重Q因为它提供?rownum q个隐式游标Q可以实C TOP cM的功能,如: SELECT TOP 10 ... FROM WHERE ...
要写?br />SELECT ... FROM ... WHERE ... AND rownum <= 10
rownum 是记录序P1Q?Q?...Q,但有一个比较麻烦的事情是:如果 SQL 语句中有 ORDER BY ... 排序的时候,rownum 居然是先“标号”后排序Q这Pq个序号如果不加处理是不合乎使用需求的?br /> 至于临时表,Oracle 的时表?SQL Server 的有很大不同Q我q没搞懂q个东西Q就不妄加揣了?br /> 国内|站中介l?Oracle 分页的资料很,我找C一个国外站点(www.faqts.comQ的一?FAQQ根据这文章的介绍Q可以如下分:Q编?Ora1Q?br />SELECT * FROM ( SELECT A.*, rownum r FROM ( SELECT * FROM Articles ORDER BY PubTime DESC ) A WHERE rownum <= PageUpperBound ) B WHERE r > PageLowerBound;
其中蓝色部分可以改ؓL的、需要的 SQL SELECT 语句Q这点倒是挺方便的?br /> Ҏ?
今天H然发现QOracle原来可以q样实现分页功能Q?br /> select * from (select rownum rdd,field1,field2 from t_table where rownum<=400) where rdd>200