其实分页这个功能老早就有了,但是每次都是写着写着就不知道丢哪去了,因为不在一个项目里,也懒得去一个个翻看,而且每次查询给的数据类型还不太一样,不过可以写方法来转,当然我没有写,嘿嘿!
其实吧数据分页的话,就分前端、后端、数据库三种,我是这么觉得的,以下内容都是我以前可能在哪看到过的和后来自己的一些理解,就这样看着吧,可能也有其它说法。
-
- DataTable dt = new DataTable();
- var Data = dt.Rows.Count > 0 ? dt.AsEnumerable().Skip(--var_page * var_rows).Take(var_rows).CopyToDataTable() : dt;
- var Count = dt.Rows.Count > 0 ? dt.AsEnumerable().Count() : dt.Rows.Count;
注意:这里运用了三目运算符?:,是因为,这个地方如果dt数据为空,切分数据会报错The source contains no DataRows.
- -- 取数据11-20,也就是rows=10;page=2;但要注意你的数据page是从0开始取数据,还是1开始取数据
- SELECT *
- FROM (SELECT *
- FROM (SELECT ROW_NUMBER () OVER (ORDER BY t.columns) AS rownumber, t.*
- FROM (Table) t) p
- WHERE p.rownumber <= 20) table_alias
- WHERE rownumber > 10;
-
-
- SELECT *
- FROM (SELECT *
- FROM (SELECT ROW_NUMBER () OVER (ORDER BY t.columns) AS rownumber, t.*
- FROM (Table) t) p
- WHERE p.rownumber > 0) table_alias
- WHERE rownumber <= 10;
注意:
- --我的新宠,最好用有索引排序的栏位来排序,速度会快很多,
- --单ROWNUM <= 6000000的上限大概是六百万,大于这个这个数,查询时间超过一秒
- --ROWNUM <= 6000000且table_alias.rowno > 599990,这两个数值越接近,查询速度越慢,两个条件同时满足,大概适用ROWNUM <= 600000(60万的数据),这样分页显示一页十行不超过一秒
-
- SELECT *
- FROM (SELECT tt.*, ROWNUM AS rowno
- FROM ( SELECT t.*
- FROM Table t
- ORDER BY CREATEDT DESC) tt
- WHERE ROWNUM <= 600000 --and CREATEDT between to_char(sysdate-30,'yyyy-MM-dd') and to_char(sysdate,'yyyy-MM-dd')
- ) table_alias
- WHERE table_alias.rowno > 599990
- ;
这个嘛,这些SQL都是当时有需求的时候百度写的,现在不过是整理一下,所以验证嘛,我就没弄,你们参考下,我记录下