2017-05-17 61 views
0

當我運行查詢:如何在oracle中限制記錄時避免將rownum作爲列?

select * 
    from (select a.*, 
       ROWNUM rnum 
      from (select * 
        from test 
        order by null) a 
      where ROWNUM <= 2000) 
    where rnum >=1 

我得到的所有列與ROWNUM一起作爲一個單獨的列,我不想要的,如何做到這一點,還是有什麼辦法來限制記錄?

+0

通過指定列的列表中明確 - 總是一個好主意。 –

+0

是否有限制記錄的其他方式? @NicholasKrasnov – svsLm

+0

這個問題有很好的答案,但是如果你不想在結果中使用rownum作爲列,那麼請不要在你的select中包含它作爲列。那樣容易。 – unleashed

回答

1

因爲最終的過濾器是ROWNUM >= 1(這將永遠是真實的),就可以消除,只是使用:

select * 
from (
    select * 
    from test 
    order by null 
) 
where ROWNUM <= 2000 

(注:ORDER BY NULL將適用於非確定性排序)

如果要指定一個不同的起始行,那麼你將需要指定要返回的列:

select col_1, 
     col_2, 
     -- ... 
     col_n 
from (
    select a.*, 
     ROWNUM rnum 
    from (
    select * 
    from test 
    order by null 
) a 
    where ROWNUM <= 2000 
) 
WHERE rnum > 1000 

在Oracle 12c中您可以使用:

SELECT * 
FROM test 
ORDER BY NULL 
FETCH FIRST 2000 ROWS ONLY; 

SELECT * 
FROM test 
ORDER BY NULL 
OFFSET 1000 ROWS FETCH NEXT 1000 ROWS ONLY; 
+0

明白了,我只是想知道除了使用rownum以外是否有限制記錄的選項? @ MT0 – svsLm

+0

@svsLm取決於您的版本 - 我剛更新了Oracle 12c。您也可以使用'ROW_NUMBER()'分析函數 - 請參閱[這個問題](http://stackoverflow.com/q/470542/1509264)瞭解其他選項/示例。 – MT0