我有以下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;
如果我将最终的WHERE更改为WHERE ROWNUM BETEEW startRecord AND endRecord
,我会得到相同的结果。
有人知道这里发生了什么?
答案 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
或使用偏移量嵌套查询。