关于SQL语句中:ROWNUM的奇怪问题.

时间:2022-09-08 14:56:05
我写了一段SQL:
select ROWNUM, OndutyID,to_char(OndutyDate,'yyyy-mm-dd') OndutyDate,Kind,Watch,Thing,Dutyplan from Oa_OnDuty where ROWNUM > 0 and ROWNUM <=10 

这样没问题.

但我改成:
select ROWNUM,OndutyID,to_char(OndutyDate,'yyyy-mm-dd') OndutyDate,Kind,Watch,Thing,Dutyplan from Oa_OnDuty where ROWNUM > 10 and ROWNUM <=20 

就出现问题了:Oa_OnDuty 表内数据很多,但执行此SQL却查不出记录来.奇怪.

我没办法只好改成:
select * from (select ROWNUM R, A.* from (select OndutyID,to_char(OndutyDate,'yyyy-mm-dd') OndutyDate,Kind,Watch,Thing,Dutyplan from Oa_OnDuty order by OndutyDate desc) A) where R > 0 and R <=10

这样就没问题了,这是什么原理啊?

7 个解决方案

#1


up,没人会吗?

#2


你对rownum理解错了,rownum是oracle系统顺序分配为从查询返回的行的编号,rownum只能是<=N,而不能大于N,例如不能
select * from t_1 where rownum=2;
select * from t_1 where rownum>1;

选择表中的某一行记录:(理解:rownum是oracle系统顺序分配为从查询返回的行的编号)
select * from (select rownum a,t.* from testtab t) where a=2;
select * from (select rownum a,t.* from testtab t) where a=3;
select * from (select rownum a,t.* from testtab t) where a=4;
   不能为:
select * from (select rownum,t.* from testtab t) where rownum=2;或
select * from testtab where rownum=2;
   返回多行记录:
select * from testtab where rownum<=10;
   返回某段记录:(如取记录表中4-10行)
select * from (select rownum no,testtab.* from testtab where rownum<=10) where no>=4;
   不能为:
select * from tsettab where rownum>10;
   返回最后一行记录:
select * from (select rownum a,t.* from testtab t) where a=(select count(*) from testtab);

#3


rownum可用于=、<、<=,但不能用于>,否则无返回结果。

#4


"rownum是oracle系统顺序分配为从查询返回的行的编号",好难理解.....

不好意思,我太笨了,还是不太明白.为什么ROWNUM不能>或者=呢?

#5


可不可以这样理解:

Oracle取出一条记录(select 1),编个号(rownum),然后比较条件(where)

#6


up

#7


rownum是你当前结果集合里面的行号,你选择行号》=n1 and <=n2的前提是什么?是已经有结果集合的前提下,你还没结果集,那ROWNUM加上有什么用呢?


而你后面写的 select * from (select ROWNUM R, A.* from (select OndutyID,to_char(OndutyDate,'yyyy-mm-dd') OndutyDate,Kind,Watch,Thing,Dutyplan from Oa_OnDuty order by OndutyDate desc) A) where R > 0 and R <=10
提前把结果集的ROWNUM取出来了(理解成已经存下来了),然后在存在的结果中选择满足条件的,后面的R字段已经跟ROWNUM没有关系了,明白吗?

#1


up,没人会吗?

#2


你对rownum理解错了,rownum是oracle系统顺序分配为从查询返回的行的编号,rownum只能是<=N,而不能大于N,例如不能
select * from t_1 where rownum=2;
select * from t_1 where rownum>1;

选择表中的某一行记录:(理解:rownum是oracle系统顺序分配为从查询返回的行的编号)
select * from (select rownum a,t.* from testtab t) where a=2;
select * from (select rownum a,t.* from testtab t) where a=3;
select * from (select rownum a,t.* from testtab t) where a=4;
   不能为:
select * from (select rownum,t.* from testtab t) where rownum=2;或
select * from testtab where rownum=2;
   返回多行记录:
select * from testtab where rownum<=10;
   返回某段记录:(如取记录表中4-10行)
select * from (select rownum no,testtab.* from testtab where rownum<=10) where no>=4;
   不能为:
select * from tsettab where rownum>10;
   返回最后一行记录:
select * from (select rownum a,t.* from testtab t) where a=(select count(*) from testtab);

#3


rownum可用于=、<、<=,但不能用于>,否则无返回结果。

#4


"rownum是oracle系统顺序分配为从查询返回的行的编号",好难理解.....

不好意思,我太笨了,还是不太明白.为什么ROWNUM不能>或者=呢?

#5


可不可以这样理解:

Oracle取出一条记录(select 1),编个号(rownum),然后比较条件(where)

#6


up

#7


rownum是你当前结果集合里面的行号,你选择行号》=n1 and <=n2的前提是什么?是已经有结果集合的前提下,你还没结果集,那ROWNUM加上有什么用呢?


而你后面写的 select * from (select ROWNUM R, A.* from (select OndutyID,to_char(OndutyDate,'yyyy-mm-dd') OndutyDate,Kind,Watch,Thing,Dutyplan from Oa_OnDuty order by OndutyDate desc) A) where R > 0 and R <=10
提前把结果集的ROWNUM取出来了(理解成已经存下来了),然后在存在的结果中选择满足条件的,后面的R字段已经跟ROWNUM没有关系了,明白吗?