SQL分页查询

时间:2017-10-17 21:17:02

标签: sql oracle

我有以下SQL结构:

SELECT * FROM (
    SELECT subquery.* FROM (
        SELECT some_columns
        FROM some_tables
        WHERE junctions_critereas
        GROUP BY some_columns
      UNION
        SELECT some_columns
        FROM some_tables
        WHERE junctions_critereas
        GROUP BY some_columns) subquery
    GROUP BY some_columns)
WHERE ROWNUM > startRecord AND ROWNUM <= endRecord;
  • 如果我排除ROWNUM criterea,查询将返回33条记录。
  • 如果我将startRecord = 0和endRecord = 10,则查询首先返回10 记录。
  • 如果我把startRecord = 0和endRecord = 20,则查询返回20条第一条记录。
  • 如果我输入startRecord = 0和endRecord = 40,则查询将返回所有33条记录。
  • 如果我输入startRecord = 10和endRecord = 20,则查询不返回任何记录。

如果我将最终的WHERE更改为WHERE ROWNUM BETEEW startRecord AND endRecord,我会得到相同的结果。

有人知道这里发生了什么?

1 个答案:

答案 0 :(得分:2)

(注意:我假设第一个条件确实是(None, 30, 1),正如@RToyota在评论中指出的那样。)

Oracle documentation对此非常清楚:

  

测试ROWNUM值大于正整数的条件   总是假的。例如,此查询不返回任何行:

ROWNUM < startRecord
     

为获取的第一行分配一个ROWNUM为1并生成   条件错误。要获取的第二行现在是第一行和   也被赋予ROWNUM为1并使条件为假。所有行   随后无法满足条件,因此不返回任何行。

在Oracle 12c中,您可以使用SELECT * FROM employees WHERE ROWNUM > 1; / OFFSET。在早期版本中,您可以使用FETCH NEXT或使用偏移量嵌套查询。