Query limit in oracle database [duplicate] - sql

This question already has answers here:
How do I limit the number of rows returned by an Oracle query after ordering?
(14 answers)
Closed 4 years ago.
I am trying to create query with kind of limit.
SELECT * FROM ALARMS WHERE OBJECT_ID=0 AND TIMESTAMP<=1525677504171 AND ROWNUM<=51 ORDER BY TIMESTAMP DESC
I use rownum but first it makes a limit and then it select ordered by. However I need to order first and then limit. I found here enter link description here that I should use FETCH FIRST 51 ROWS ONLY. Unfortunately it doesn't work.
SELECT * FROM ALARMS WHERE OBJECT_ID=0 AND TIMESTAMP<=1525677504171 ORDER BY TIMESTAMP DESC FETCH FIRST 51 ROWS ONLY;
It throws me following error:
SQL Error [933] [42000]: ORA-00933: SQL command not properly ended
oracle.jdbc.OracleDatabaseException: ORA-00933: SQL command not properly ended

You miss ONLY at the end. This syntax is available since 12c R1 if I remember correctly. Which Oracle version you use?
SELECT * FROM ALARMS WHERE OBJECT_ID=0 AND TIMESTAMP<=1525677504171 ORDER BY TIMESTAMP DESC FETCH FIRST 51 ROWS ONLY
;
Edit:
Since your version is 11g then try to use such syntax (I hope it will work;))
SELECT *
FROM (
SELECT a.*,ROW_NUMBER() OVER(ORDER BY TIMESTAMP DESC) rcnt
FROM ALARMS A WHERE OBJECT_ID=0 AND TIMESTAMP<=1525677504171) src
WHERE src.rcnt <= 51
ORDER BY src.TIMESTAMP desc;

FETCH FIRST is only available since Oracle 12c.
For the rownum approach, use a subquery that contains order by, then limit the rows in the enclosing query:
SELECT * FROM (
SELECT * FROM ALARMS WHERE OBJECT_ID=0 AND TIMESTAMP<=152567750417
ORDER BY TIMESTAMP DESC
) dt
WHERE ROWNUM<=51

Related

Error ORA-00933: SQL command not properly ended | Oracle

I'm getting the error:
Error ORA-00933: SQL command not properly ended
When I run the following ORACLE query:
Select "col1", "col2"
from SCHEMANAME.TABLENAME
OFFSET 100 ROWS FETCH NEXT 100 ROWS ONLY
Any solutions?
My guess is that you are running Oracle < 12.2, where the fetch clause is not available.
A typical workaround uses window functions:
select col1, col2
from (
select t.*, row_number() over(order by id) rn
from schemaname.tablename t
) t
where rn between 101 and 200;
Note that, for both your original query and this query to produce a stable result, you need a column that deterministically defines the ordering of the rows. I assumed id.
If you do want an unstable sort, which I would not recommend, then use order by null in the over() clause of row_number().

'limit' clause in Oracle SQL "SQL command not properly ended" [duplicate]

This question already has answers here:
How do I limit the number of rows returned by an Oracle query after ordering?
(14 answers)
Closed 5 years ago.
I know that questions related to 'limit' have been asked before here,
and I have already referred to them. My question is somewhat different.
Here's my query:
select id,somecol from sometable where someval=2 order by id desc limit 3
I'm getting an error saying 'SQL command not properly ended'.
How do I resolve this? If you need additional information, feel free to tell me so.
Generally, we use LIMIT in MYSQL database and Rownum in Oracle.
MySQL Syntax:
SELECT column_name(s)
FROM table_name
WHERE condition
LIMIT number;
Oracle Syntax:
SELECT column_name(s)
FROM table_name
WHERE ROWNUM <= number;
References:
https://www.w3schools.com/sql/sql_top.asp
If you are running Oracle 12c, you could use FETCH FIRST n ROWS ONLY:
SELECT id, somecol
FROM sometable
WHERE someval = 2
ORDER BY id DESC
FETCH FIRST 3 ROWS ONLY;

SQL Command error: Incorrect syntax near '4' [duplicate]

This question already has answers here:
LIMIT 10..20 in SQL Server
(15 answers)
Closed 5 years ago.
I get a "Incorrect syntax near '4'." while executing this command :
#"SELECT * FROM [Table] OFFSET 4 LIMIT 2;"
what is the probem here?
The SQL SELECT TOP Clause
The SELECT TOP clause is used to specify the number of records to return.
The SELECT TOP clause is useful on large tables with thousands of records. Returning a large number of records can impact on performance.
Note: Not all database systems support the SELECT TOP clause. MySQL
supports the LIMIT clause to select a limited number of records, while
Oracle uses ROWNUM.
SQL Server / MS Access Syntax:
SELECT TOP number|percent column_name(s)
FROM table_name
WHERE condition;
Example
SELECT TOP 2 *
FROM [Table]
There is no LIMIT in SQL Server. You use FETCH:
Without an ORDER BY, the OFFSET is meaningless, so you can just do
SELECT TOP 2 t.*
FROM [Table] t;
If you do have an ORDER BY:
SELECT t.*
FROM [Table] t
ORDER BY ?
OFFSET 4 ROWS FETCH FIRST 2 ROWS ONLY;
The ? is a placeholder for the name of the column you want to sort by.

Getting limited result from oracle in order [duplicate]

This question already has answers here:
How do I limit the number of rows returned by an Oracle query after ordering?
(14 answers)
Closed 8 years ago.
I have a set of 4000 records,I am only allowed to retrieve 300 records.
I am doing pagination on the resultset, but since we are limiting the result to 300 i am getting different results for each DB hit.
So is there any option to get the ordered first 300 of the 4000 records, without getting the entire result of 4000 records.
Below is the query:
select id from table where name='ronaldo' and rownum <= 300 order by id asc;
The problem is the query is processed in the following order:
The FROM/WHERE clause goes first.
ROWNUM is assigned and incremented to each output row from the FROM/WHERE clause.
SELECT is applied.
GROUP BY is applied.
HAVING is applied.
ORDER BY is applied.
For that reason, your query as written will return a random 300 records.
You'll need to do a nested query, something like this:
select * from
(select * from table
where name='ronaldo' order by id asc)
where ROWNUM <= 300;
Also, if you're using Oracle 12c or higher, you can use the completely non-standard FETCH FIRST syntax:
SELECT *
FROM table
WHERE name='ronaldo'
ORDER BY id asc
FETCH FIRST 300 ROWS ONLY;
Why they don't support the LIMIT keyword? Because they're Oracle.

Oracle 11g and SQL TOP query

While using SELECT TOP 5 * FROM SOMETABLE gives me an error
ORA-00923: FROM keyword not found where expected
I am using Oracle 11g . I am aware of using rownum for doing the same thing but just wondering SQL TOP usage is not at all supported in Oracle ? Anything need to do extra to make SQL TOP working in Oracle ??
Oracle does not support TOP. Use ROWNUM
SELECT * FROM your_table
WHERE ROWNUM <= 5
SQLFiddle example
No, Oracle does not support TOP.
As you point out, the best approach is to use rownum. Another option is the analytical function ROW_NUMBER.
The rownum keyword, while it gets you the said no. of records, does so only after applying the order by clause if you have one.
So if the SQL server query is as below, it will give you 10 most recently created records.
Select TOP 10 * from mytable order by created_date desc
But to fit Oracle, when you write this, it gets you the 10 records (that may not be the most recent ones) and arranges them in descending order, which is not what you wanted.
Select * from mytable where rownum < 10 order by created_date desc
So writing with an additional select like this would help:
SELECT * FROM (Select * from mytable order by created_date desc) where rownum < 10
SQL TOP does NOT work for Oracle.