目的:A表数据按时间排序后,根据需要查出第1~5条,或者第5~10条数据
SQL1:select order from A where rownum<6 order by dt desc;
结果:查出的结果并不是按照时间倒序排列后的前5条。
SQL2:select order from (select order from A order by dt desc) where rownum < 6;
SQL3:select order from (select order from A order by dt desc) where rownum < 6 and rownum > 0;
结果:SQL2 可以实现,但是SQL3查不出任何内容
SQL4:select
t.trackno, t.order from (select rownum trackno, order from (select
order from A order by dt desc ) ) t where t.trackno>5 and
t.trackno<10;
结果:可以实现。
总结:
rownum是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,而且rownum不能以任何表的名称作为前缀。
SQL1,2,3 中,Oracle首先分配rownum,之后才order by dt desc, 因此,根据rownum<6 查出的结果并不能按照时间排序。SQL4,子查询中先将表按照时间排序,然后再分配rownum,这时再增加条件rownum<6,就能够满足要求 了。