1,我想问一下大家,如果条件中有order by f_id,并且这个f_id是主键。那么rownum的值会不会被重写?
2,比如:表A有字段f_id,f_name,f_id是主键
select rownum,f_id,f_name from A
select rownum,f_id,f_name from A order by f_id
select rownum,f_id,f_name from A order by f_name这两条查询语句排列出来的rownum的值是不是会相同?我的结果是不相同,但是有另外一张表B,有字段f_id,f_name,f_id是主键。
select rownum,f_id,f_name from A
select rownum,f_id,f_name from A order by f_id
select rownum,f_id,f_name from A order by f_name
这三条语句得到的rownum的值是相同的,只不过顺序不同。这是什么原因
2,比如:表A有字段f_id,f_name,f_id是主键
select rownum,f_id,f_name from A
select rownum,f_id,f_name from A order by f_id
select rownum,f_id,f_name from A order by f_name这两条查询语句排列出来的rownum的值是不是会相同?我的结果是不相同,但是有另外一张表B,有字段f_id,f_name,f_id是主键。
select rownum,f_id,f_name from A
select rownum,f_id,f_name from A order by f_id
select rownum,f_id,f_name from A order by f_name
这三条语句得到的rownum的值是相同的,只不过顺序不同。这是什么原因
如果不是主键,先取ROWNUM再排序
如果不是主键,先取ROWNUM再排序
后边这句不太理解
你全表select不加order by 的时候rownum
就是从第一条记录到最后一条记录依次排下去的.
加了order by 之后只是记录的排序方式变了.
但是rownum还是没变的.该是什么就是什么.
所以,rownum也是按主键来的.
如果顺序和按主键查询不一致,rownum就变了.
a b rowid(此处ROWID为假设值,和实际的ROWID不一样,实际上ROWID是个16进制值)
1 1 1
2 2 3
3 3 2此处说到ROWID的问题,可能有人会问,为什么ROWID不是顺序的
去了解下ORACLE的块原理就知道,只有在刚开始时ROWID才是顺序增长的,一旦数据库有了删除等动作,时间长了,ROWID就不是顺序增长的select a.*,rownum from a 没有任何排序
结果
a b rowid rownum
1 1 1 1
3 3 2 2
2 2 3 3
select a.*,rownum from a order by a 按主键排序a b rowid rownum
1 1 1 1
2 2 3 2
3 3 2 3select a.*,rownum from a order by b 按非主键排序a b rowid rownum
1 1 1 1
2 2 3 3
3 3 2 2select a.*,rownum from(select * from a order by b) a 先按非主键排序,再显示ROWNUMa b rowid rownum
1 1 1 1
2 2 3 2
3 3 2 3
上面三段用DESC排序再看
1主键排序
select a.*,rownum from a order by a desca b rowid rownum
3 3 2 1
2 2 3 2
1 1 1 32非主键排序select a.*,rownum from a order by b desca b rowid rownum
3 3 2 2
2 2 3 3
1 1 1 13非主键二层sql
select a.*,rownum from(select * from a order by b desc)
a b rowid rownum
3 3 2 1
2 2 3 2
1 1 1 3