首先请看一组使用rownum作为查询条件的查询语句:
查询语句1:
SELECT ROWNUM,t.userid,t.mobilephone FROM t_user_base t WHERE ROWNUM < 10;
查询结果:
ROWNUM USERID MOBILEPHONE
---------- ----------- ------------
1 100 15223400356
2 101 13996130645
3 102 13814013535
4 103 13996130634
5 104 15223406666
6 105 13439289196
7 106 13540605072
8 107 13730674217
9 108 15828275907
查询语句2:
select ROWNUM,t.userid,t.mobilephone FROM t_user_base t WHERE ROWNUM > 1 and ROWNUM < 10;
查询结果:(一个空的结果集)
ROWNUM USERID MOBILEPHONE
---------- ----------- ---------------------
查询语句3:(注意等号)
select ROWNUM,t.userid,t.mobilephone FROM t_user_base t WHERE ROWNUM >= 1 and ROWNUM < 10;
查询结果:
ROWNUM USERID MOBILEPHONE
---------- ----------- ------------
1 100 15223400356
2 101 13996130645
3 102 13814013535
4 103 13996130634
5 104 15223406666
6 105 13439289196
7 106 13540605072
8 107 13730674217
9 108 15828275907
查询语句4:
select ROWNUM,t.userid,t.mobilephone FROM t_user_base t WHERE ROWNUM > 1;
查询结果:(一个空的结果集)
ROWNUM USERID MOBILEPHONE
---------- ----------- ---------------------
查询语句5:(注意等号)
select ROWNUM,t.userid,t.mobilephone FROM t_user_base t WHERE ROWNUM >= 1;
查询结果:
ROWNUM USERID MOBILEPHONE
---------- ----------- ------------
1 100 15223400356
2 101 13996130645
3 102 13814013535
4 103 13996130634
5 104 15223406666
6 105 13439289196
7 106 13540605072
8 107 13730674217
9 108 15828275907
....该表的所有结果集...
问题分析:
在oracle中,要查询结果集中的第10条到第20条之间的数据,不能用如下的语句:
select col_a from tab_xx where rownum between 10 and 20;
或者
select col_a from tab_xx where rownum >10 and rownum < 20;
原因:在oracle中的rownum是一个伪列,其值是从查询的结果集中排序,由1开始增长,而且必须从1开始增长,
从查询出来的数据来看,rownum的值不可能有大于1,而没有1这个值。
也就是说,如果一个查询中有rownum > a >=1 这种情况的话,那么oracle的返回只会是一个空的结果集。
解决方案:
所以,要查第10条到第20条之间的数据,可采用如下方案:
方案1:做一个差集操作
(select col_a from tab_xx where rownum < 20) minus (select col_a from tab_xx where rownum < 10);
方案2:将rownum演变成一个实际的列。
select rownum_alis,col_a_alis from(select rownum, col_a from tab_xx where rownum < 20) where rownum_alis > 10;