oracle的rownum函数无序,取前几条的话,每次结果不固定,很坑

笔者有个学年学期表,里面有个字段是当前学年学期,我要查询的结果是从当前学年学期(不包含当前学年学期)往前取6个学期的数据。所有的数据是这样的:

select xqb.* from dm_xnxqb@jcps_jw xqb where kyf='1' order by xn||xq desc

结果:
在这里插入图片描述
然后我要取,途中选中的数据往下取6条数据。
我是这么写的:

select xqb.* from dm_xnxqb@jcps_jw xqb
where xqb.xn||xqb.xq <= (select xn||xq from dm_xnxqb@jcps_jw where sfdqxq='1') 
and xqb.kyf='1'
and rownum < 7
order by xqb.xn||xqb.xq desc

结果:
在这里插入图片描述
一看结果是6条,也没细看,以为就是对的了。
后来出问题了。
说数据年份不是连续的,不正确。
我的第一反应就是:怎么可能!
但是事实上就是如此,确实不正确。
这个问题就是取决于oracle自带的rownum函数。
其实这个函数自己有自己的排序规则(有空我再百度,现在忙着呢),在你查询的时候给每一列都差生了一个行号,但是你是通过查询条件查询出来的,所以行号就不会在你查询出的结果里显示1234567…,而是早就生成的rownum数值了,不信的话,你可以在里层就查询出rownum,然后你查询完后的数据,rownum值肯定不是123456…。
知道问题的所在之后,当然就会想办法解决,
我的解决办法是:在外层再套一层,然后现在里层排好序,在外层取rownum值
代码奉上:

select t.*,rownum from(
  select xqb.* from dm_xnxqb@jcps_jw xqb
  where xqb.xn||xqb.xq < (select xn||xq from dm_xnxqb@jcps_jw xqb where xqb.kyf='1' and xnmc||xq='20182') 
        and xqb.kyf='1' and xqb.xq !=3
  order by xqb.xn||xqb.xq desc
)t where rownum<7 order by xnmc||xq desc

哦了,完美解决。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值