How do I limit the number of rows returned by an Oracle query after ordering?

前端 未结 17 1488
夕颜
夕颜 2020-11-21 04:56

Is there a way to make an Oracle query behave like it contains a MySQL limit clause?

In MySQL, I can do this:

         


        
17条回答
  •  日久生厌
    2020-11-21 05:04

    Starting from Oracle 12c R1 (12.1), there is a row limiting clause. It does not use familiar LIMIT syntax, but it can do the job better with more options. You can find the full syntax here. (Also read more on how this works internally in Oracle in this answer).

    To answer the original question, here's the query:

    SELECT * 
    FROM   sometable
    ORDER BY name
    OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;
    

    (For earlier Oracle versions, please refer to other answers in this question)


    Examples:

    Following examples were quoted from linked page, in the hope of preventing link rot.

    Setup

    CREATE TABLE rownum_order_test (
      val  NUMBER
    );
    
    INSERT ALL
      INTO rownum_order_test
    SELECT level
    FROM   dual
    CONNECT BY level <= 10;
    
    COMMIT;
    

    What's in the table?

    SELECT val
    FROM   rownum_order_test
    ORDER BY val;
    
           VAL
    ----------
             1
             1
             2
             2
             3
             3
             4
             4
             5
             5
             6
             6
             7
             7
             8
             8
             9
             9
            10
            10
    
    20 rows selected.
    

    Get first N rows

    SELECT val
    FROM   rownum_order_test
    ORDER BY val DESC
    FETCH FIRST 5 ROWS ONLY;
    
           VAL
    ----------
            10
            10
             9
             9
             8
    
    5 rows selected.
    

    Get first N rows, if Nth row has ties, get all the tied rows

    SELECT val
    FROM   rownum_order_test
    ORDER BY val DESC
    FETCH FIRST 5 ROWS WITH TIES;
    
           VAL
    ----------
            10
            10
             9
             9
             8
             8
    
    6 rows selected.
    

    Top x% of rows

    SELECT val
    FROM   rownum_order_test
    ORDER BY val
    FETCH FIRST 20 PERCENT ROWS ONLY;
    
           VAL
    ----------
             1
             1
             2
             2
    
    4 rows selected.
    

    Using an offset, very useful for pagination

    SELECT val
    FROM   rownum_order_test
    ORDER BY val
    OFFSET 4 ROWS FETCH NEXT 4 ROWS ONLY;
    
           VAL
    ----------
             3
             3
             4
             4
    
    4 rows selected.
    

    You can combine offset with percentages

    SELECT val
    FROM   rownum_order_test
    ORDER BY val
    OFFSET 4 ROWS FETCH NEXT 20 PERCENT ROWS ONLY;
    
           VAL
    ----------
             3
             3
             4
             4
    
    4 rows selected.
    

提交回复
热议问题