当前位置:数据库 > Oracle >>

oracle 中的rownum 是什么时候产生的?

oracle 中的rownum 是什么时候产生的? 在一个查询语句中 select a,*, rownum from test group by a.sysid 等到的rownum并不是按顺序排的。 具体例子见: http://hi.zzzyk.com/%D1%A9%B0%E9%CE%D2%D0%D0/blog/item/a4218015271fef1b4b90a7fc.html 请多指教
追问:若是在select * from table_name 后就出现。哪通过WHERE 子句作出筛选后,省下的ROWNUM不会都刚好是从1开始,以步长1递增的数字吧。毕竟有些ROWNUM也应该被筛选掉了。
请指教,谢谢你的回答。谢谢!
可能是境界没到,还是看不明白。
下来多用用,应该能有所得。
到时再与你分享。嗯,我知道是自动生成的,我就是想知道它在什么时间点上自动生成的。
答案:在我说什么时候产生的之前,我想说一下SELECT这个查询语句的执行顺序问题:
语法是:
select * from table_name 
where conditons1
group by some_column
 having conditions2 
order by some_column;
执行时是这样的:先从表中查询出所有的数据,然后conditions1中筛选出符合条件的数据,然后对数据进行分组,having是对分组后的数据进行筛选,最后进行排序,不过聚合函数与group by一起出现时,聚合函数会后执行.
明白这个之后,rownum这个伪列就不可能会在where之后出现,所以不管查询有什么条件,在完成
select * from table_name这个时候,它就出现了,就会在表的每一行上按顺序加上rownum.
比如你说的这个查询如果想按顺序出现rownum应该这样写:
select a.*,rownum a_rownum from(
select * from test group by a.sysid
) a;
当然了里面的子查询要正确;
如果说你想对test表中的数据查询出来之后,按SYSID这一列进行排序后查询3到5条数据,类似于小数据量(千万条以内)的先排序后分页:语句可以这样写
select * from (
select a.*,rownum t_rownum from (
select * from test order by sysid
)
) where t_rownum between 3 and 5;
总之就是说:select a.* ,rownum a_rownum from table_name a时就会在列上按顺序加上rownum. 

这是我的原创哦*_*
其他:rownum列是在向oracle数据库中插入数据时自动生成的,由于你的group by语句才打乱他的顺序 

上一个:oracle,为什么创建不了视图,scott用户下,MLDN那个视频里去可以,为什么???
下一个:sql的基本语句(如:insert、update、delete)在mysql、oracle和SQL SERVER中用法一样吗??

Oracle
MySQL
Access
SQLServer
DB2
Excel
SQLite
SYBASE
Postgres
如果你遇到数据库难题:
请访问www.zzzyk.com 试试
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,