up 一个select 语句啊。
解决方案 »
- Linux下装oracle数据库为何要重新创建一个用户(oracle)
- oracle数据库连接问题:Io 异常: Connection refused
- oracle启动database control问题
- 优化一个SQL语句
- 未启用特性: Materialized view rewrite,请高手帮忙,该什么处理.
- 在線等!sql裡怎麼把單引號變成雙引號?
- oracle中存放有格式的文本内容的时候用什么数据类型?
- 高分求救:如何把SQL数据库数据还原到oracle数据库中?
- 关于查询!!
- 知者不难的问题---oracle里有没有像sql server那样生成diagram(表间关系图)的工具?
- Left Outer Join 问题 ~~
- 急!请问oracle817报这个错误“ORA-01033: Message 1033 not found; No message file for product=RDBMS,facility=ORA”是什么意思,如何
bak between 1 and 100;
但是我怎么知道这个rownum,或者是说,rownum是非排序的,我怎么知道从哪个rownum开始选择呢?
select * from (select id,name ,age,sex,location,row_number() over (order by age) rn from User where ...) where rn between ((curPage-1)*pageSize+1) and curPage*pageSize;其中:curPage是当前的页数,pageSize是每页想显示的条数。
当然你可以将pageSize设为100,就可以每次查出100条,而且是根据age排序的.
这样其实是静态分页的,也就是假设当前数据表是静态不变的,但是如果当前用户表 user 是动态变化的,即有用户不断的加入,也有用户需要注销, 那么上面的那种静态的分页方式是否就不可行了呢?举例:当前有300个用户 user000-user300 ,但是这时又添加进来100 个用户,而原来的300 用户又有5个注销了,那么数据库是如何适应这样的改变的呢?
create view v_user as select rownum num,a.* from user a;
然后你就可以动态sql语句进行查询某些段的纪录:
start 、end为程序中变化的查询段的起始结束点。
EXECUTE 'select * from v_user where num between '||start||'and'||end';
create table tb (
col2 varchar2(10)--和user表的id列属性相同
)
然后 用过程来处理数据,实现每次处理100条,并将处理过的记录的id 放在tb表中
tb表的col列标记是否处理过了
不知可否
-------------------
你这样做,可行,但是实际运行的效率是很低的,因为你必须考虑到有进80万的用户表,如果你每次都去查你这个临时表tb,随着临时表的体积变大,那么查询需要的时间将越来越多,后来系统效率就大打折扣。
然后,我每次从数据库取 N 到 N+100条记录,对这100条记录进行分析,分析完毕,
把这100条记录的flag标志位置为1,继续取下100条记录。等所有的记录都处理完毕,为了防止有的记录没有处理过,再做一次查询:
slecet * from user where flag =0;
只要还有flag标志位为0的记录,我就继续对该记录进行分析处理。
直到数据库所有的记录都处理完毕。
select * from xx WHERE ROWNUM >= num1 AND ROWNUM <= num2你可以自己在oracle机子上测试,实际上这样执行的SQL语句根本不能产生结果记录集。
因为这里 ROWNUM 还没有定义他的范围。我又试过用 dinya2003(OK) 的方法,发现这个方法其实很可靠。
--------------------------------------------------------------------------------------
取得第三百条到第四百条记录的写法,修改一下即可.select * from (select rownum rm,a.* from table_name a where rownum<=400) where rm>=300
-------------------------------------------------------------------------------------- tanyun1111(TY) 的做法看起来有点复杂,我没有试,不知道正确不正确。再次感谢大家的参与!
下面的两种写法:
1)select * from (select rownum rm,a.* from table_name a where rownum>=300) where rm<=400
2)select * from (select rownum rm,a.* from table_name a where rownum<=400) where rm>=300大家认为结果一样吗?呵呵,虽然逻辑上行得通,都是一样,但是只有第二种写法是正确的!