oracle里数据的抽出结果排序,第一次和第二次不一样,第二次以后保持不变,什么原因?

如题所述

oracle对无order by的语句返回的结果不进行排序,oracle此时的处理方式是按照数据的物理存储顺序来读取数据。因为rowid是每行数据的地址,所以有时候看起来会像是使用rowid排序的。但这个顺序是可能被打乱的,在表的数据被删除后,rowid会被新插入的数据占用。所以一个无order by查询结果看起来也可能是个杂乱无章的。
oracle的数据库实现就一个原则,怎么快怎么效率高就怎么来。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-01-18
假设排序的字段名字为field1降序, table name: tab
SELECT field1, field2, field3... fieldn
FROM (SELECT field1, field2, field3...fieldn, ROW_NUMBER() OVER(ORDER BY field1 DESC) AS RK ) FROM tab ) t
WHERE rk = 1

00904是说列名不正确,仔细看了下,AS RK后面多了一个括号,下面这样就可以了
SELECT field1, field2, field3... fieldn
FROM (SELECT field1, field2, field3...fieldn,
ROW_NUMBER() OVER(ORDER BY field1 DESC) AS RK
FROM tab
where field1=表名.字段名) t
WHERE rk = 1

我给你改一下吧,你写的那个效率很低的
SELECT t1.a, t1.b, t2.field1, t2.field2, t2.field3...t2.fieldn
FROM lkk t1,
(SELECT field1, field2, field3...fieldn,
ROW_NUMBER() OVER(ORDER BY field1 DESC) AS RK
FROM tab) t
WHERE t.field1 = t1.a
AND t.rk = 1
相似回答