如果想先排序后取值就这样 select * from (select * from t order by ...) where rownum<10
给个例子你看下就清楚了: SQL> select * from aaa_csdn_1; ID ---------- 9999 2423 434 5412 6532SQL> SELECT * FROM AAA_CSDN_1 WHERE (ROWNUM < 5); ID ---------- 9999 2423 434 5412SQL> SELECT * FROM AAA_CSDN_1 WHERE (ROWNUM < 5) ORDER BY ID; ID ---------- 434 2423 5412 9999 注意:此处没有取得 6532的记录,说明是先取记录 后 排序的得到先排序 后 取前4个 SQL> SELECT * FROM (SELECT * FROM AAA_CSDN_1 ORDER BY ID) WHERE ROWNUM < 5; ID ---------- 434 2423 5412 6532
其实我一直也是这么想的,包括上面这位大哥的方法我都知道. 但由于我查询的过程中出现了这样一来的现象. 如果先取值后排序,那么对于20条记录,ORDER BY任何字段都会得到同样的记录,哪怕顺序不同. 但我用了ORDER BY 不同的字段,居然得到的是不同的记录,于是才有这种疑惑了.
对于我的数据库的一个表,我用 select * from tbi_sa06 where rownum<10 order by crd_no 和 select * from tbi_sa06 where rownum<10 order by crd_depriv_mgt_no 所查询的记录是不一样的.我的表的记录有40多条.
你是还有其他条件吧,如 select * from tbi_sa06 where ...>... and rownum<10 order by crd_depriv_mgt_no 这种情况下可能会不一样的
排序+取前多少条的数据还是这样解决比较保险: 1.Select * From ( Select test.*, rank() over(Partition By monthid Order By gz Desc) rk From test) Where rk = 10 ----oracle支持rank函数 2. select * from test a where (select count(*) from test b where a.gz < b.gz and a.monthid = b.monthid) < 11
似乎和你的where处字段是否有索引有关系 如果该sql不用索引,full table scan会根据数据的物理储存位置(一般先输入的先取出)取出在排序 有索引,index range scan,那么取出来的值本来就有一定逻辑顺序,再排序的效果和上者就不太一样了
select * from (select * from t order by ...) where rownum<10
SQL> select * from aaa_csdn_1; ID
----------
9999
2423
434
5412
6532SQL> SELECT * FROM AAA_CSDN_1 WHERE (ROWNUM < 5); ID
----------
9999
2423
434
5412SQL> SELECT * FROM AAA_CSDN_1 WHERE (ROWNUM < 5) ORDER BY ID; ID
----------
434
2423
5412
9999
注意:此处没有取得 6532的记录,说明是先取记录 后 排序的得到先排序 后 取前4个
SQL> SELECT * FROM (SELECT * FROM AAA_CSDN_1 ORDER BY ID) WHERE ROWNUM < 5; ID
----------
434
2423
5412
6532
但由于我查询的过程中出现了这样一来的现象.
如果先取值后排序,那么对于20条记录,ORDER BY任何字段都会得到同样的记录,哪怕顺序不同.
但我用了ORDER BY 不同的字段,居然得到的是不同的记录,于是才有这种疑惑了.
select * from tbi_sa06
where rownum<10
order by crd_no
和
select * from tbi_sa06
where rownum<10
order by crd_depriv_mgt_no
所查询的记录是不一样的.我的表的记录有40多条.
select * from tbi_sa06
where ...>... and rownum<10
order by crd_depriv_mgt_no
这种情况下可能会不一样的
我的表太大了,有80多个字段.所以不方便写出来.本来这个SQL与项目无关,是我自己发现了这个问题.
难道你们没出现过吗?
1.Select * From (
Select test.*, rank() over(Partition By monthid Order By gz Desc) rk From test)
Where rk = 10
----oracle支持rank函数
2.
select * from test a
where (select count(*) from test b where a.gz < b.gz and a.monthid = b.monthid) < 11
如果该sql不用索引,full table scan会根据数据的物理储存位置(一般先输入的先取出)取出在排序
有索引,index range scan,那么取出来的值本来就有一定逻辑顺序,再排序的效果和上者就不太一样了
WHERE处也没有其它字段.
解决方法我知道!ROW_NUMBER()OVER(),RANK()OVER(),DENSE_RANK()OVER()我都会用.
我只是发现了这么一个怪现象,请大家来参详一下而已!
查询语句就是select * from tablename
这种情况只遇到过一次,以后就没遇到过了。sbaz(万神渡劫),你那个表一直这样吗?
我的那个表,虽然两个SQL检索的记录不同,但我在不同的时间用两个中的某一条语句检索的记录还是一定的.
希望大家多做试验,多交流一下,我暂不结帖.3天后结!
不过你的数据要多点才行!
还有这种事情? GZ
----------------
瞧这帖分数给的...巨受打击 ToT