有三条sql语句:select rownum rnum,t.* from duty_users t
select rnum,user_code from (select rownum rnum,t.* from duty_users t)
select rnum,user_code,user_name from (select rownum rnum,t.* from duty_users t)
结果分别是
//--    select rownum rnum,t.* from duty_users t    ---//
RNUM      USER_CODE     USER_NAME     USER_GENDER
  1       fan           范              1
  2       d             dd              1
  3       zhangsan      zhangsan        1
  4       admin         管理员          1//---   select rnum,user_code from (select rownum rnum,t.* from duty_users t)   --//
RNUM      USER_CODE    
  1       admin          
  2       d            
  3       fan      
  4       zhangsan         //--    select rnum,user_code,user_name from (select rownum rnum,t.* from duty_users t)    ---//
RNUM      USER_CODE     USER_NAME    
  1       fan           范             
  2       d             dd             
  3       zhangsan      zhangsan       
  4       admin         管理员          
发现第二条语句查询的结果与其他语句查询的结果顺序不一致,好像第二条语句按照user_code排序了,不知道为什么?

解决方案 »

  1.   

    user_name 上是否有索引不过也是有点奇怪 看执行计划看看
      

  2.   

    当只选择USER_CODE时,USER_CODE上有索引,
    如果读取索引的代价更小时,将直接读取索引中的user_code,
    而不会从表中读取
      

  3.   

    老兵新手,
    可是lz的语句每次都是选择的所有的列。应该外层user_code早已经从表中取出来了,不存在走不走索引了吧
      

  4.   

    set autotrace on  --开启执行计划set autotrace off --关闭
      

  5.   

    把你的语句贴到你的plsql里,选定你的语句,然后按下F5
      

  6.   

    出现Cannot SET AUTOTRACE是什么情况啊?
      

  7.   

    那就对了.
    By default, Oracle Database sorts indexes in ascending order when it creates the index. 
      

  8.   

    select rnum,user_code from (select /*+full(duty_users)*/ rownum rnum,t.* from duty_users t);
    这样修改下
      

  9.   

    select rnum,user_code from (select rownum rnum,t.* from duty_users t order by rowid)
      

  10.   

    select rnum,user_code from (select /*+full(t)*/ rownum rnum,t.* from duty_users t);
    ------上面的写错了,要使用别名。