我在网上搜索Oracle分页查询,其中大部分都告诉我将查询包装两次:
SELECT *
FROM (SELECT t.*, ROWNUM rn
FROM tableName t
WHERE ROWNUM < 200)
WHERE rn > 100
Run Code Online (Sandbox Code Playgroud)
只是想知道我是否可以输入:
SELECT *, ROWNUM rn
FROM tableName t
WHERE ROWNUN BETWEEN 100 AND 200
Run Code Online (Sandbox Code Playgroud)
似乎第二个也适用.这两个查询之间是否存在(性能)差异?
问题是您正在生成 ROWNUM 的同一查询中进行过滤。因此,您必须让子查询首先生成 rownum,然后应用过滤。为什么 BETWEEN 工作正常可能是引擎处理查询方式的一些细微差别,但我会小心它可能不会始终为您提供正确的结果。因此,这不是性能问题,而是实际获得正确结果的问题。
本文解释了为什么必须将大于放在子查询之外: http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/pseudocolumns009.htm
SELECT * FROM employees
WHERE ROWNUM > 1;
Run Code Online (Sandbox Code Playgroud)
“提取的第一行被分配了 ROWNUM 1 并使条件为假。要提取的第二行现在是第一行,并且也被分配了 ROWNUM 1 并使条件为假。随后所有行都无法满足条件,因此不会返回任何行。”
| 归档时间: |
|
| 查看次数: |
1871 次 |
| 最近记录: |