目的:
根据 rid 属性,得到 A表 最大的 rtime 属性值对应的记录。sql:
select  *  from A  where rid='3636'   order   by   rtime desc可以得到正确的结构,其中rtime=‘2008-11’但是当我改成如下sql:
select  *  from A  where rownum<2 and rid='3636'   order   by   rtime desc得到的结果竟然是rtime=‘2003-01’的记录
这个到底是为什么呢??现在我将sql改成:
select a.* from  (select * from A where rid='3636' order by rtime desc) a where rownum<2
可以得到正确的结构,但是速度很慢。。请高手帮忙解答下,只有这一种解决的方法么??

解决方案 »

  1.   

    select  *  from A  where rid='3636'  order  by  rtime desc 与 
    select  *  from A  where rownum <2 and rid='3636'  order  by  rtime desc对于第一条记录,应该是相同的吧 
      

  2.   

    对啊
    可是前两条sql得到的记录竟然不一样好奇怪啊
      

  3.   

    rownum 是一个变化的数,不是固定不变的,你不同的查询语句可能得到不同的rownum.
      

  4.   

    看两个SQL的执行计划确实不一样,如果order by的字段建有索引,应该就一致了,楼主不妨试试。
      

  5.   

    rownum 是最先被筛选的条件所以你看到了=‘2003-01’
    可以这么写
    select * from( select  *  from A  where rid='3636'  order  by  rtime desc ) where rownum <2
      

  6.   


    这个不一定相同呀第一条语句,是查询rid='3636'然后按rtime排序.而第二条语句,是先查询出rid='3636'和rownum<2取一条记录,然后排序,这时排序语句已经失去意义了.因为rownum是一个变化的值,只是一个行号
      

  7.   

    明白了
    原来是先where,然后再order by啊。那如果我想先where ,order by后,再取rownum,
    除了
    select a.* from  (select * from A where rid='3636' order by rtime desc) a where rownum <2 
    还有别的办法么??因为我用了这个嵌套后,速度明显变慢了
      

  8.   

    我在rtime上建了索引,果然可以了!!请问,为什么呢??
      

  9.   

    -- 这是SQL执行顺序的问题,详细的信息GOOGLE一下就知道了,试试下面的语句:
     SELECT *
       FROM A A1
      WHERE NOT EXISTS (SELECT 1
               FROM A A2
              WHERE A1.RID = A2.RID
                AND A1.RID = '3636'
                AND A1.RTIME < A2.RTIME)
        AND A1.RID = '3636';
      

  10.   


    谢谢,mantisXF但是这个语句,比
    select * from( select  *  from A  where rid='3636'  order  by  rtime desc ) where rownum <2
    效率要低吧
      

  11.   

    此外,这张表是张分区表,数据量非常大,
    我在rtime上建索引,是会影响查询效率的吧??