其中rownum在500000和1000000之间

时间:2019-06-03 09:30:00

标签: sql oracle

我创建了一个表,该表具有180万行,尽管可以提取为CSV,但无法将其打开。这不是经常运行的查询,并且最终用户的技术能力很低。因此,我想要一种快速而又肮脏的修补程序,而该工具花费的时间很少。

我的解决方案是将查询分为多个部分:

SELECT  *
  FROM  my_table 
 WHERE  ROWNUM BETWEEN 0 AND 500000

上面的方法很好,

SELECT  *
  FROM  my_table
 WHERE  ROWNUM BETWEEN 500001 AND 1000000

下一次迭代没有。

我检查了肯定有180万行。

这是怎么回事?我想念什么?

1 个答案:

答案 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;