Search code examples
sqloracle-databaseselectoracle10grow-number

SQL Query With Row_Number, order by and where clause


I have the following SQL query:

select
     ID, COLUMN1, COLUMN2
from
     (select ID, COLUMN1, COLUMN2, row_number() over (order by 2 DESC) NO from A_TABLE)
where
     NO between 0 and 100

What I am trying to do is to select the first 100 records of the query

select ID, COLUMN1, COLUMN2 from ATABLE order by 2 DESC

And here are the problems:

  1. Apparently, the order by clause is not working. I've noticed that I have to add another order by 2 DESC clause, just after (...) from ATABLE, for my query to work. Is there something I do wrong? Or is it expected behaviour?

  2. How can I add a where clause? Let's say I need to select only the first 100 records of the table where COLUMN1 like '%value%'. I've tried adding the where clause after (...) from ATABLE but it produced an error...

Help? Thanks.

PS: I'm using Oracle 10g R2.


Solution

  • rownum is a pseudo column that counts rows in the result set after the where clause has been applied.

    Is this what you're trying to get?

    SELECT *
    FROM ( 
        SELECT id, column1, column2
        FROM atable ORDER BY 2 DESC
    ) 
    WHERE ROWNUM < 100;
    

    Because it's a pseudo column that is strictly a counter of rows resulting from the where clause it will not allow you to do pagination (i.e. between 200 & 300).

    This is probably what you're looking for:

    SELECT *
    FROM
     (SELECT a.*, rownum rnum FROM
         (SELECT id, column1, column2 FROM atable ORDER BY 2 DESC) a WHERE rownum <= 300)
    WHERE rnum >= 200;