1

我的查询有问题吗?我在下面使用 AUDIT_ACTN 排序的前 5 个结果,然后是 AUDIT_STAMP。

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 和 2。我希望你理解我的问题我真的需要帮助。谢谢!

4

2 回答 2

2

我记得读过ORDER BY子查询不能保证,但这里有一个替代解决方案,它ROW_NUMBER包括ORDER BYin it'sOVER子句:

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

这是小提琴

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

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

在子查询中,ORDER BY 子句是没有意义的,除非它带有结果偏移量和 fetch first 子句中的一个或两个,或者与 ROW_NUMBER 函数一起使用,因为不能保证在外部结果集中保留顺序。允许将外部查询中的 ORDER BY 与子查询中的 ORDER BY 结合起来。

祝你好运。

于 2013-02-11T02:30:34.540 回答
1

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

 SELECT * FROM 
    (SELECT Field1, Field2, rank() OVER (ORDER BY Field1,Field2) AS rank
     FROM TABLE_SAMPLE 
     ) t 
    WHERE t.rank <= 5
于 2013-02-11T05:11:47.510 回答