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的值是相同的,只不过顺序不同。这是什么原因

解决方案 »

  1.   

    如果是主键的话,先排序,然后ROWNUM按排序后的
    如果不是主键,先取ROWNUM再排序
      

  2.   


    如果不是主键,先取ROWNUM再排序
    后边这句不太理解
      

  3.   

    但rownum和主键的对应关系是否变化呢
      

  4.   

    主键和rownum没有关系啊.
    你全表select不加order by 的时候rownum
    就是从第一条记录到最后一条记录依次排下去的.
    加了order by 之后只是记录的排序方式变了.
    但是rownum还是没变的.该是什么就是什么.
      

  5.   

    默认排序应该是按主键吧.
    所以,rownum也是按主键来的.
    如果顺序和按主键查询不一致,rownum就变了.
      

  6.   

    事实上是没有默认排序的不加ORDER BY 是按写入的顺序读取,这时候rownum从1开始升序显示,数据随机显示按主键排序加rownum, rownum仍然从1开始升序,数据也是按主键排序后显示不按主键排序,显示的结果,rownum乱序显示,数据按排序结果用两层SQL,第一层先排序,外面层再显示SQL,ROWNUM从1开始升序显示,数据也按排序显示
      

  7.   

    设数据a,a字段为主键
    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
      

  8.   

    那为什么通过不同的排序,会让显示出来的rownum的值不一样呢