SQL Server数据分页的问题

selecttop页大小*fromtable1whereid>(selectmax(id)from(selecttop((页码-1)*页大小)idfromtable1or... select top 页大小 *
from table1
where id>
(select max (id) from

(select top ((页码-1)*页大小) id from table1 order by id) as T
)
order by id


SELECT TOP 10 * FROM
(
SELECT top 10 ROW_NUMBER() OVER (ORDER BY ReportID) AS RowNo
FROM TABLE
) AS A
WHERE RowNo > " + pageIndex*10
pageIndex就是我们需要数据的页数

现在我有一个问题,就是当数据表中的数据上百万,我们用rownum() over(order by 字段)这个函数读取行号的时候,它的效率会怎么样?
能不能用案例说明一下,我看了还是解不了心中的疑惑!
展开
 我来答
ArleneLuo
2010-01-14 · TA获得超过201个赞
知道答主
回答量:134
采纳率:0%
帮助的人:0
展开全部
//得到页号
int pageId=Integer.parseInt(request.getParameter("pageId"));

int begin=(pageId-1)*pageSize;
String select =request.getParameter("select");

String sqlLimit="";//分页sql语句
String sqlCount="";//总行数sql语句
ShowTravleInfoManager sm = new ShowTravleInfoManager();

//无条件分页查询所有景点信息
if(select.equals("all"))
{
sqlCount = "select count(*) from travleInfo";
sqlLimit="select top "+pageSize+" * from travleInfo t,areaInfo a where t.travleId not in " +
"(select top "+begin+" travleId from travleInfo) and t.areaId=a.areaId order by t.travleId";
}

一:分页的分类:
分页有真分页和假分页两种,

假分页即把所有数据一次性提取到内存中.再分页.
缺点:数据量太大.访问慢.

真分页则用SQL语句在数据库中提取本页数据到内存中. 缺点:程序不好移植.

二: 真分页作法:
一般是通过sql语句查询出指定页号的数据 .请注意数据库支持的关键字

1. sql server 用 top :前几行
2. oracle 用 rownum :行号之差
3. Mysql 用 limit ; 行号之差

三:测试:
表:
create table stuInfo-- 学生信息表
(
stuId varchar(20) primary key,
stuName varchar(20),
stuSex varchar(8),
stuAddress varchar(40)
);
insert into stuInfo values('A001','xie','男','湖南长沙');
insert into stuInfo values('A002','张飞','男','湖南长沙');
insert into stuInfo values('A003','王熙凤','男','湖南长沙');
insert into stuInfo values('A004','李逵','男','湖南长沙');
insert into stuInfo values('A005','张力','男','湖南长沙');
insert into stuInfo values('A006','张飞','男','湖南长沙');
insert into stuInfo values('A007','王凤','男','湖南长沙');
insert into stuInfo values('A008','李达','男','湖南长沙');
insert into stuInfo values('A009','xie','男','湖南长沙');
insert into stuInfo values('A010','张飞','男','湖南长沙');
insert into stuInfo values('A011','王熙凤','男','湖南长沙');
insert into stuInfo values('A012','李逵','男','湖南长沙');
insert into stuInfo values('A013','张力','男','湖南长沙');
insert into stuInfo values('A014','张飞','男','湖南长沙');
insert into stuInfo values('A015','王凤','男','湖南长沙');
insert into stuInfo values('A016','李达','男','湖南长沙');
select * from stuInfo;

在:MSSQL2005中的写法:
select top 5 * from stuInfo
where stuId not in
(select top 5 stuId from stuInfo)
order by stuId
--5:代表第2页

在:oracle中的写法:
--查询第1页数据. (当前页-1)*每页几行
select * from stuInfo where rownum<=1*5
minus
select * from stuInfo where rownum<=0*5;

在mysql中的写法:
select * from stuInfo limit 0,5;
select * from stuInfo limit 5,10;

具体用法:
一:在javaBean中,返回一个bean对象集合
public List getProductById(String id,int pageId,int pageNum)
{
Connection conn=null;
try
{ ArrayList li=new ArrayList();
int begin=(pageId-1)*pageNum;
String sql="select * from item where productid='"+id
+"' limit "+begin+","+pageNum+"";
conn= ShopDB.getConnection();
Statement st= conn.createStatement();
java.sql.ResultSet rs= st.executeQuery(sql) ;
while(rs.next())
{
Item myitem=new Item();
myitem.setItemid(rs.getString("itemid"));
myitem.setListprice(rs.getFloat("listprice"));
myitem.setUnitcost(rs.getFloat("unitcost"));
myitem.setName(rs.getString("name"));
myitem.setDescrition(rs.getString("descrition"));
myitem.setImagepath(rs.getString("imagepath"));
li.add(myitem);
}
return li;
}
catch (Exception e) {
e.printStackTrace();
return null;
}finally{
ShopDB.colseConn(conn) ;

}
二:hibernate中:返回一个二维数组集合.
//真分页方法
public List findUserPageData(int pageId,int pageNum) {
try {
int comp=(pageId-1)*pageNum;
String sql = "select * from Userinfo limit "+comp+","+pageNum;
System.out.println(sql);
SQLQuery queryObject = getSession().createSQLQuery(sql);
return queryObject.list();
} catch (RuntimeException re) {
throw re;
}
}
public static void main(String[] args) {
try {
UserinfoDAO dao = new UserinfoDAO();
List list=dao.findUserPageData(1, 2);
System.out.println("大小:"+list.size());
for (int i = 0; i < list.size(); i++) {
Object kk[] =(Object[]) list.get(i);
System.out.println("姓名" + kk[1]);
}
cjdxhc
2010-01-13 · TA获得超过168个赞
知道小有建树答主
回答量:116
采纳率:0%
帮助的人:129万
展开全部
rownum 当前效率高,微软做过优化!
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式