我创建了一个表,该表具有180万行,尽管可以提取为CSV,但无法将其打开。这不是经常运行的查询,并且最终用户的技术能力很低。因此,我想要一种快速而又肮脏的修补程序,而该工具花费的时间很少。
我的解决方案是将查询分为多个部分:
SELECT *
FROM my_table
WHERE ROWNUM BETWEEN 0 AND 500000
上面的方法很好,
SELECT *
FROM my_table
WHERE ROWNUM BETWEEN 500001 AND 1000000
下一次迭代没有。
我检查了肯定有180万行。
这是怎么回事?我想念什么?
答案 0 :(得分:3)
Rownum应用于查询结果,而不应用于表。应用rownum以获得前1m行,然后过滤掉前0.5m。
select *
from (
SELECT t.*, rownum rn
FROM my_table t
WHERE ROWNUM BETWEEN 0 AND 1000000
) where rn > 500000
此外,正如@Connor在评论中指出的那样,rownum过滤器本身可能不会产生确定性的结果。使用order by
子句应用适当的顺序。在这种情况下,SQL更改为:
select *
from (
SELECT t.*, rownum rn
FROM (
select *
from my_table
order by x, y, z -- apply appropriate sort order here
) t
WHERE ROWNUM BETWEEN 0 AND 1000000
) where rn > 500000
这写起来很繁琐。在Oracle 12c +中,新的FETCH FIRST/NEXT
语法更加简洁:
select *
from my_table
order by x, y, z -- apply appropriate sort order here
offset 500000 rows
fetch next 500000 rows only;