oracle 取第一条记录可以用下面的方式实现,为什么不能用同样的方法取第二条记录
select pac_period_id     from (select cpp.pac_period_id
                                            ,cpp.period_name
                                        from cst_pac_periods cpp
                                       where cpp.legal_entity = 102
                                       order by cpp.pac_period_id desc)
                                   where rownum =1

解决方案 »

  1.   


    select k.pac_period_id from 
    select pac_period_id,rownum rn from (select cpp.pac_period_id
      ,cpp.period_name
      from cst_pac_periods cpp
      where cpp.legal_entity = 102
      order by cpp.pac_period_id desc) k
    where rn = 2
      

  2.   

    上面没写好……select k.pac_period_id from (
    select pac_period_id,rownum rn from (select cpp.pac_period_id
      ,cpp.period_name
      from cst_pac_periods cpp
      where cpp.legal_entity = 102
      order by cpp.pac_period_id desc) 
    )k
    where rn = 2
      

  3.   


    select *
      from (
              select a.*, rank() over(order by pac_period_id) as lev
              from (
                    select cpp.pac_period_id, cpp.period_name
                      from cst_pac_periods cpp
                     where cpp.legal_entity = 102
                     order by cpp.pac_period_id desc
                   ) a
            
            )
     where lev = 2
      

  4.   


    为什么这个查询结果是升序的,是因为rank() over(order by pac_period_id)这个缘故吗
      

  5.   

    推荐oracle 中实现select top N
      

  6.   

    这是因为rownum不能像 想象中 的那样用
      

  7.   

    order by pac_period_id desc  这样就可以
      

  8.   

    rownum的使用必须要包括第一条记录, 也就是 rownum >= 1 这个语句可以, 
    而rownum > 1 则不可以, 因为这个条件中rownum为1时就不成立了. 
    所以直接使用 rownum=2 也不会有结果显示, 因为 1 != 2.
    在这种情况下就是利用嵌套查询来实现了!~
      

  9.   

    有排序,那么就是三重嵌套rownum或者分析函数两重搞定
      

  10.   

    order by pac_period_id 默认情况下是 按升序排的。
      

  11.   

    对啊, 没看到里面已经有order by 了麽。