在Oracle中使用ROWNUM获得前5个结果

时间:2013-02-11 02:15:52

标签: sql oracle top-n

我的查询有问题吗?我使用下面的代码来获得AUDIT_ACTN然后AUDIT_STAMP排序的前5个结果。

SELECT * FROM (SELECT * FROM TABLE_SAMPLE ORDER BY AUDIT_ACTN  
ASC,AUDIT_STAMP ASC)
WHERE ROWNUM <= 5

我用它来检查我是否得到了正确的行。

SELECT * FROM TABLE_SAMPLE  ORDER BY 
AUDIT_ACTN,AUDIT_STAMP

问题是第二个查询的前5行与第一个查询的结果略有不同。只有3行是相同的,根据我的观察,另外2行是rownum1&amp;第二个查询中的2个。我希望你理解我的问题我真的需要帮助。谢谢!

2 个答案:

答案 0 :(得分:2)

我记得读过ORDER BY不能保证使用子查询,但这是使用ROW_NUMBER的替代解决方案 - 这包括ORDER BY中的OVER子句:

SELECT * FROM 
(SELECT Field1, Field2, ROW_NUMBER() OVER (ORDER BY Field2,Field1) AS RN 
 FROM TABLE_SAMPLE 
 ) t 
WHERE RN <= 5

这是Fiddle

这里有一些关于Oracle,子查询和ORDER BY的文档:

http://docs.oracle.com/javadb/10.8.2.2/ref/rrefsqlj13658.html

  

在子查询中,除非是ORDER BY子句,否则它是没有意义的   首先伴随结果偏移和提取中的一个或两个   子句或与ROW_NUMBER函数一起使用,因为有   无法保证订单保留在外部结果集中。它是   允许将外部查询的ORDER BY与ORDER BY组合在一起   子查询。

祝你好运。

答案 1 :(得分:1)

试试这个:此查询返回前5条记录。

 SELECT * FROM 
    (SELECT Field1, Field2, rank() OVER (ORDER BY Field1,Field2) AS rank
     FROM TABLE_SAMPLE 
     ) t 
    WHERE t.rank <= 5