5

我在网上搜索Oracle分页查询,大多数都告诉我将查询包装两次:

SELECT * 
  FROM (SELECT t.*, ROWNUM rn 
          FROM tableName t 
         WHERE ROWNUM < 200) 
 WHERE rn > 100

只是想知道我是否可以将其键入为:

SELECT *, ROWNUM rn 
  FROM tableName t 
 WHERE ROWNUN BETWEEN 100 AND 200

似乎第二个也有效。这两个查询之间是否有任何(性能)​​差异?

4

2 回答 2

4

使用 ROWNUM 的正确方法是:

SELECT x.* 
  FROM (SELECT t.*, 
               ROWNUM rn 
          FROM tableName t) AS x
 WHERE x.rn > 100
   AND x.rn < 200

BETWEEN是包容性的,所以这两个查询不是相同的逻辑。

有关 ROWNUM 的更多信息,请参阅此链接(包括指向 Oracle 文档的链接

于 2011-08-16T03:52:49.780 回答
4

问题是您在生成 ROWNUM 的同一查询中进行过滤。因此,您必须让子查询首先生成 rownum 然后应用过滤的原因。为什么 BETWEEN 工作正常可能是引擎如何处理查询的一些细微差别,但我会担心它可能不会始终如一地给你正确的结果。因此,这不是性能问题,而是实际获得正确结果的问题。

这篇文章解释了为什么你必须在子查询之外放置大于:http: //download.oracle.com/docs/cd/B19306_01/server.102/b14200/pseudocolumns009.htm

SELECT * FROM employees
    WHERE ROWNUM > 1;

“提取的第一行的 ROWNUM 为 1,使条件为假。要提取的第二行现在是第一行,也被分配了 1 的 ROWNUM,使条件为假。所有行随后都不满足条件,因此不返回任何行。"

于 2011-08-16T03:59:05.230 回答