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);
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不能>或者=呢?
不好意思,我太笨了,还是不太明白.为什么ROWNUM不能>或者=呢?
#5
可不可以这样理解:
Oracle取出一条记录(select 1),编个号(rownum),然后比较条件(where)
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没有关系了,明白吗?
而你后面写的 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);
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不能>或者=呢?
不好意思,我太笨了,还是不太明白.为什么ROWNUM不能>或者=呢?
#5
可不可以这样理解:
Oracle取出一条记录(select 1),编个号(rownum),然后比较条件(where)
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没有关系了,明白吗?
而你后面写的 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没有关系了,明白吗?