ORACLE ROWRUM查询第二条数据如何查询

SELECT  ROWNUM aa,a.* FROM tc_jfa_file a WHERE tc_jfadate = to_date('16/05/19','yy/mm/dd' AND ROWNUM=2 ) ORDER BY tc_jfa02

  ROWNUM=2 这样查询是没有数据的

原因:ROWNUM是一个伪列。该值在被读入cache中时被分配了一个值。每次查询该值都可能变化。同样的一行记录,可能由于读入cache中的行数不同,而导致ROWNUM不同。

解决方案:

可以这样写:SELECT * FROM (SELECT ROWNUM num,a.* FROM tc_jfa_file a WHERE tc_jfadate = to_date('16/05/19','yy/mm/dd') ORDER BY tc_jfa02) a WHERE a.num=2


另外:以下来源 http://blog.csdn.net/yihuiworld/article/details/44701827

取第一条数据/前几条数据:你是否在用ORDER BY 和 rownum=1 / rownum<xx 来SQL

特别说明:上面提供的demo中有2条slip=201308的数据,且item分别为1、2,其中item=2的先插入数据库,再插入item=1的数据

[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. --取201308年月里面ORDER BY slip ASC,item ASC的第一笔数据  
  2. --×,很多人经常如下写SQL,order by排序然后以为rownum=1就是取的第一条想要的数据  
  3. SELECT rowid,rownum,t_salary.* FROM t_salary  
  4.  WHERE slip='201308'  
  5.    AND rownum = 1  
  6.  ORDER BY slip ASC,item ASC  

SQL应该如下这样写:

[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. --先将查询排序做为1个结果集,再从这个子查询的结果集里面再取rownum=1的数据,取得到才是按排序后的第一条数据  
  2. SELECT * FROM   
  3.   (SELECT t_salary.* FROM t_salary  
  4.     WHERE slip='201308'  
  5.    --AND rownum = 1  
  6.   ORDER BY slip ASC,item ASC  
  7.   )  
  8.  WHERE rownum = 1  
  9.  --ORDER BY slip ASC,item ASC  
如上sql SELECT * FROM (SELECT a.* FROM tc_jfa_file a WHERE tc_jfadate = to_date('16/05/19','yy/mm/dd' ) ORDER BY tc_jfa02) a WHERE ROWNUM=1,也就是子查询不需要rownum查询
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值