Colorful Life2010

Tag: 分页 | 记录数: 3
DB2(as400)数据分页SQL
Weather:None

方法1:

利用DB2自带(ORACLE一样)的”ROWNUMBER() OVER(ORDER BY sort-key)”函数来完成,用法如下

select * from (select rownumber() over(order by sortkey1 asc,sortkey2 desc,…) as rownumber_,* from dbname1 order by sortkey1 asc,sortkey2 desc) as temp_db where rownumber_ between ?start+1 and ?end

这种方法由于是DB2自带的,相对来说大量数据的时候效率可能会好点(待求证),但如果是查询的表比较多和条件比较多的时候感觉会有点混乱,容易出错.

 

方法2:

之前用过MSSQL的那种取出前一部分的最大ID然后再取比这个ID大的相对的page size数量的数量,这个方法比较通用一些,但问题是同样组装比较复杂,当然你可以弄到PROC里面,二是这个方法数据量很大的情况下,越往后的分页效率越低,并且效率变化很明显.

 

方法3:

使用”FETCH FIRST ?pagesize ROWS ONLY”,用法如下

select * from dbname1 where key not in(select key from dbname1 FETCH FIRST (page-1)*pagesize ROWS ONLY) FETCH FIRST pagesize ROWS ONLY

这种方法的效率现在还无从考证,但这种方法比较容易组装SQL,因为分页的部分虽然字符比较多,但全放在了条件语句后面.

 

综合三种方法,第二种需要一个排列的KEY,这样的条件,对于AS400里的DB2比较麻烦,因为我操作过的很多表,其实里面是没有用于排序的KEY甚至是没有KEY的,AS400采用自己的游标(类似一个内部的ID)来知道当前是第几条数据.第一第三种方法在KEY这方面相对好一些,但还不是太完美.

Sybase 分页方法,存储过程(转)
Weather:17~27度,晴,北风4~5级

您可以使用 FIRST 或 TOP 关键字限制查询的结果集中包括的行数。这些关键字用于包括 ORDER BY 子句的查询。

示例  
以下查询返回在按姓氏对雇员进行排序时首先出现的雇员的信息:

SELECT FIRST *
FROM employee
ORDER BY emp_lname
以下查询返回按姓氏排序时出现的前五个雇员:

SELECT TOP 5 *
FROM employee
ORDER BY emp_lname
在使用 TOP 时,您也可以使用 START AT 来提供偏移。以下语句列出按姓氏以降序进行排序时出现的第五个和第六个雇员:

SELECT TOP 2 START AT 5 *
FROM employee
ORDER BY emp_lname DESC
FIRST 和 TOP 只能与 ORDER BY 子句联合使用,以确保获得一致的结果。如果使用 FIRST 或 TOP 时没有 ORDER BY,则会触发语法警告,并且很可能产生无法预知的结果。

注意  
'start at' 值必须大于 0。当 'top' 为常量时,其值必须大于 0;当 'top' 为变量时,其值必须大于或等于 0。

SQLite使用NHibernate分页的BUG
Weather:晴,西南风4-5级,(2.0~8.0)℃

先说明,我用的是NHibernate2.0.1-GA版本,测试版的,并且以下出现的问题已经被BUG TRACKER记录并修正,但是NH站上提供的BIN也好,源SOURCE也好,都还没有更新。

具体情况:我用的是SQLite3,然后使用上述的NHibernate进行数据库操作,在进行分页的时候,只能正确分出第一页和第二页,从第三页开始往后,只显示第二页的内容。

SQLite 中分页取数据的方面是SQL语句后面加limit startRow,offset,如果是第一页,直接就是limit offset;比如我每页显示10条,正常情况下是,第一页limit 10,第二页limit 10,10,第三页limit 20,10,第四页limit 30,10。。。