布衣王子

Email:roose2008@gmail.com QQ:79212131

问题请教:SQL查询语句怎样限定返回结果集的行数

例如:
select * from tbale where vip = 1;
这样返回的结果集是表table中字段vip=1的所有纪录。
如果纪录有1000行,我怎样才能利用SQL语句在查询的时候就只返回 100行到200行的纪录呢?
要怎样的SQL语句才能实现?请教请教。
有的人说用limit来限定,但是只有mysql才支持limit。我想找一中能长远的方法能被大众数据库支持的方法。
谢谢 (我主要考虑到在做分页显示的时候如果将记过集一次性查询出来然后再来分页打印的话太耗内存,
如果能查询几行显示几行然后再查询的话,这样能够缓解服务器的内存)

posted on 2008-10-04 17:12 草包书生 阅读(5130) 评论(13)  编辑  收藏

评论

# re: 问题请教:SQL查询语句怎样限定返回结果集的行数 2008-10-04 18:00 隔叶黄莺

没有长远的方法。  回复  更多评论   

# re: 问题请教:SQL查询语句怎样限定返回结果集的行数 2008-10-04 18:11 逝水fox

这个是没有办法的了 SQLServer和MySQL在这个问题上使用不同的关键字
参考Hibernate的处理
在Loader类里面是
if ( useLimit ) {
sql = dialect.getLimitString( sql.trim(), useOffset ? getFirstRow(selection) : 0, getMaxOrLimit(selection, dialect) );
}
这里可以看到 限制返回行数的SQL他是交给具体的方言对象来处理的dialect
而MySQLDialect
public String getLimitString(String sql, boolean hasOffset) {
return new StringBuffer( sql.length()+20 ).append(sql).append( hasOffset ? " limit ?, ?" : " limit ?").toString();
}
而SQLServerDialect则是使用的
public String getLimitString(String querySelect, int offset, int limit) {
if ( offset > 0 ) {
throw new UnsupportedOperationException( "sql server has no offset" );
}
return new StringBuffer( querySelect.length()+8 ).append(querySelect).insert( getAfterSelectInsertPoint(querySelect), " top " + limit ).toString();
}

顺便一说 OracleDialect是会抛出UnsupportedOperationException异常的

你可以自己参考Hibernate的实现实现这个功能 但是 关键是 数据库方言本身 是需要配置的 你自己程序虽然可以用方言的方式来猜测是哪种数据库 但是 毕竟麻烦  回复  更多评论   

# re: 问题请教:SQL查询语句怎样限定返回结果集的行数 2008-10-04 18:13 R_XiaoGuang

这段代码也许对你有用
源码来自:http://www.blogjava.net/supercrsky/archive/2008/09/23/230723.html

/**
* 查询用户(带分页)
*
* @param startNo
* 开始条数
* @param maxCount
* 最大记录数
* @return
*/
public List<User> getAll(int startNo, int maxCount)
{
Connection conn = DBConnection.getConn();
String sql = "select * from person";
List<User> users = new ArrayList<User>();
try
{
if (this.getAllSize() <= 0)
return null;
PreparedStatement pstmt = conn.prepareStatement(sql,
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
// 最大查询到第几条记录
pstmt.setMaxRows(startNo + maxCount - 1);
ResultSet rs = pstmt.executeQuery();
// 将游标移动到第一条记录
rs.first();
// 游标移动到要输出的第一条记录
rs.relative(startNo - 2);
while (rs.next())
{
User user = new User();
user.setId(rs.getInt("id"));
user.setUsername(rs.getString("username"));
user.setAge(rs.getInt("age"));
user.setRemark(rs.getString("remark"));
users.add(user);
}

} catch (SQLException e)
{
e.printStackTrace();
} finally
{
try
{
conn.close();
} catch (SQLException e)
{
e.printStackTrace();
}
}
return users;
}  回复  更多评论   

# re: 问题请教:SQL查询语句怎样限定返回结果集的行数 2008-10-04 18:46 隔叶黄莺

建议放到新手区或提问区  回复  更多评论   

# re: 问题请教:SQL查询语句怎样限定返回结果集的行数[未登录] 2008-10-04 19:06 草包书生

@R_XiaoGuang
谢谢,我要的就是这个!十分感谢!
就是不知道prepareStatement内部封装的SQL语句是什么样的。
感谢  回复  更多评论   

# re: 问题请教:SQL查询语句怎样限定返回结果集的行数[未登录] 2008-10-04 19:06 草包书生

@隔叶黄莺
知道了,马上放  回复  更多评论   

# re: 问题请教:SQL查询语句怎样限定返回结果集的行数[未登录] 2008-10-04 19:07 草包书生

@逝水fox
谢谢,十分感谢。我试着搞一下
thank you  回复  更多评论   

# re: 问题请教:SQL查询语句怎样限定返回结果集的行数 2008-10-04 20:39 Ron.Liu

强烈建议,不要用游标!!!

可以用top关键字
创建一个临时表,用来需要返回的结果。
先向表中插入top200,再删除top100
最后select中间表返回

sql server  回复  更多评论   

# re: 问题请教:SQL查询语句怎样限定返回结果集的行数 2008-10-04 20:39 Ron.Liu

嗯,我的方法要用存储过程  回复  更多评论   

# re: 问题请教:SQL查询语句怎样限定返回结果集的行数 2008-10-04 20:42 Ron.Liu

更好的方法:
解1: select top 10 * from A where id not in (select top 30 id from A)
解2: select top 10 * from A where id > (select max(id) from (select top 30 id from A )as A)   回复  更多评论   

# re: 问题请教:SQL查询语句怎样限定返回结果集的行数[未登录] 2008-10-04 20:53 草包书生

@Ron.Liu
这种运算也行得通,不过mysql不支持top运算。
不过还是感谢之极  回复  更多评论   

# re: 问题请教:SQL查询语句怎样限定返回结果集的行数[未登录] 2008-10-04 20:55 草包书生

@Ron.Liu
你太聪明了  回复  更多评论   

# re: 问题请教:SQL查询语句怎样限定返回结果集的行数 2008-10-23 23:52 jiaqiang

查询第M行到第N行的问题,可以试试以下的查询语句:
select 列名,[列名]..
from (select rownum rn, 列名,[列名]..
from(select 列名,[列名]...
from table_name
order by id
)
where rownum <= N

)
where rn >= M;
  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 

导航

常用链接

相册

java的相关连接

最新评论