笔者有个学年学期表,里面有个字段是当前学年学期,我要查询的结果是从当前学年学期(不包含当前学年学期)往前取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
哦了,完美解决。