181

I want to use oracle syntax to select only 1 row from table DUAL. For example, I want to execute this query:

SELECT user 
  FROM DUAL

...and it'd have, like, 40 records. But I need only one record. ...AND, I want to make it happen without a WHERE clause.

I need something in the table_name field such as:

SELECT FirstRow(user) 
  FROM DUAL
10
  • 1
    What version of Oracle? Using ROWNUM or ROW_NUMBER (9i+) would mean needing a WHERE clause Commented Jan 19, 2012 at 0:25
  • 1
    Did you name a table dual ? Commented Jan 19, 2012 at 0:25
  • 3
    @ypercube dual is the system table in oracle Commented Jan 19, 2012 at 0:26
  • 4
    @Ben, you really shouldn't create a table called DUAL. It's a bit like #define TRUE 0 in C - sure, it might work for you, but future developers will hate you. Commented Jan 19, 2012 at 4:53
  • 3
    Have you actually tried to run select user from dual? If not, please try that, and see what you get. On a standard oracle system, you'll get back the user you are executing the command with. Commented Jan 19, 2012 at 6:38

14 Answers 14

224

You use ROWNUM.

ie.

SELECT user FROM Dual WHERE ROWNUM = 1

http://docs.oracle.com/cd/B19306_01/server.102/b14200/pseudocolumns009.htm

Sign up to request clarification or add additional context in comments.

6 Comments

@ypercube far as I can tell, it does. (At least it works for my installation of oracle10g.)
@bdares: it will work, yes. But not your answer, with the order by.
Yes. ROWNUM is a special column that gets added to the result set enumerating the results. You can use it to select multiple as well, for example, if you wanted to find the 10 highest payed employees, you might say "SELECT user FROM Employees WHERE ROWNUM <= 10 ORDER BY SALARY DESCENDING"
@mkdess: No, ORDER BY is applied after the WHERE.
You'd need: SELECT * FROM (SELECT user FROM Employees ORDER BY SALARY DESC) WHERE ROWNUM <= 10
|
105

This syntax is available in Oracle 12c:

select * from some_table fetch first 1 row only;
select * from some_table fetch first 1 rows only;
select * from some_table fetch first 10 row only;
select * from some_table fetch first 10 rows only;

^^I just wanted to demonstrate that either row or rows (plural) can be used regardless of the plurality of the desired number of rows.)

4 Comments

select * from some_table fetch first 1 row only; its not working in my swl devloper nor in sql plus so error at fetch.
Are you using oracle 12c?
i dont really know but when i open it it shows like this: SQL * PLus Release 10.1.0.4.2 is it not 12 c
correct - you are using likely using version 10.1.xxx , you can SELECT * FROM V$VERSION
64

I found this "solution" hidden in one of the comments. Since I was looking it up for a while, I'd like to highlight it a bit (can't yet comment or do such stuff...), so this is what I used:

SELECT * FROM (SELECT [Column] FROM [Table] ORDER BY [Date] DESC) WHERE ROWNUM = 1

This will print me the desired [Column] entry from the newest entry in the table, assuming that [Date] is always inserted via SYSDATE.

5 Comments

I found it will also work if you order by ROWID, as long as you never delete any records and always care about the last inserted/modified one.
@vapcguy: Don't expect ROWID to be ordered, even if you never delete a row from the table! Even if it works for you now, it is never guaranteed to work in future versions.
@D.Mika Actually if it works now, and you never add/remove/update/delete records, there should never be any issues. The records can only be changed if you actually change them. There is this misconception that somehow ROWID is randomly modified by Oracle. It isn't. It is based on actually modifying the rows, i.e. you delete one, then insert one. The inserted one will get the old one's ROWID. There are such things as static tables that never get updated-like states in the U.S. is a good example-where if it changed, it would probably have other repercussions, anyway, when this is fine.
@vapcguy: Well, thats almost right. But there are other operations that will change the ROWID. What if you export / import the table for some reason? There are others operation, but some of them need ENABLE ROW MOVEMENT. I just want to say it's no good idea to rely on an implementation detail that may change in the future.
@D.Mika I'm sure if there are any operations where the ROWID could be changed, a good DBA would look them up and do what they could to avoid them if there was the possibility they were affecting such a static table as I described that only the application should be operating on. A table export can be done with a SELECT statement, instead. The import would happen once and then never again. I get your point, care is definitely needed, but the issues are far from unavoidable.
18

we have 3 choices to get the first row in Oracle DB table.

1) select * from table_name where rownum= 1 is the best way

2) select * from table_name where id = ( select min(id) from table_name)

3)

select * from 
    (select * from table_name order by id)
where rownum = 1

2 Comments

Thanks for the answers: under point 3) "nowrum= 1" should probably be changed to "rownum = 1".
First option works!
10

You should use nested query as:

SELECT *
FROM ANY_TABLE_X 
WHERE ANY_COLUMN_X = (SELECT MAX(ANY_COLUMN_X) FROM ANY_TABLE_X) 

=> In PL/SQL "ROWNUM = 1" is NOT equal to "TOP 1" of TSQL.

So you can't use a query like this: "select * from any_table_x where rownum=1 order by any_column_x;" Because oracle gets first row then applies order by clause.

3 Comments

Please add some clarification to your answer
Unusual syntax should be avoided without a good reason. In this case, it would be helpful to provide either a test case or a bug number. I vaguely recall some weird issues with rownum = 1, but we shouldn't let old bugs affect our code anymore.
@hgwhittle, The reason why Fuat is correct is because ROWNUM doesn't care about 'ordery by', it just grabs the first record it can find and immediately returns it. So in other words, the ROWNUM qualifier doesn't have any respect for "Order By" command. I wish that wasn't the case but Fuat is correct, to use the nested query.
6

As far as I know, the dual table in Oracle is a special table with just one row. So, this would suffice:

SELECT user
FROM dual

4 Comments

that's not true select user from dual should give you all the users
.. and just tried out on my system, works as ypercube & all related documentation mentions. @Ben
@Ben dual is not a catalog view, it won't show "all the users". You would use a view like ALL_USERS for that purpose.
5

There is no limit 1 condition (thats MySQL / PostgresSQL) in Oracle, you need to specify where rownum = 1.

Comments

4

"FirstRow" Is a restriction and therefor it's place in the where clause not in the select clause. And it's called rownum

select * from dual where rownum = 1;

3 Comments

Note that this will not work as expected in combination with ORDER BY, since ordering only happens after the where clause. In other words, to get the top of a certain sorted query, rownum is utterly useless.
@Nyerguds, this is only half true. You can use order by before the Where with a View query.
What, so SELECT * FROM (SELECT * FROM ... WHERE ... ORDER BY ...) WHERE ROWNUM = 1? Well, that may work, but it looks pretty dumb, tbh.
4

If you want to get back only the first row of a sorted result with the least subqueries, try this:

select *
  from ( select a.*
              , row_number() over ( order by sysdate_col desc ) as row_num
           from table_name a )
  where row_num = 1;

1 Comment

Where sysdate_col would be the name of any column you want to sort by and of course, table_name would be the name of the table you want the sorted data to come from.
2

If any row would do, try:

select max(user)  
from table;

No where clause.

1 Comment

Surely it will only take seconds for you to try that out for yourself
1
select name, price
  from (
    select name, price, 
    row_number() over (order by price) r
      from items
  )
where r between 1 and 5; 

Comments

1

select a.user from (select user from users order by user) a where rownum = 1

will perform the best, another option is:

select a.user 
from ( 
select user, 
row_number() over (order by user) user_rank, 
row_number() over (partition by dept order by user) user_dept_rank 
from users 
) a 
where a.user_rank = 1 or user_dept_rank = 2

in scenarios where you want different subsets, but I guess you could also use RANK() But, I also like row_number() over(...) since no grouping is required.

Comments

0

More flexible than select max() is:

select distinct first_row(column_x) over (order by column_y,column_z,...) from Table_A

Comments

0

In oracle 11g, The below example can be helpful....

 SELECT *
 FROM
 (
    SELECT *
        
    FROM RF_ACTN_STATUS STS 
    WHERE 
        STS.RF_ACTN_TYPE_ID=27 AND 
        STS.ACTION_SORT>2 AND 
        NVL(STS.IS_RESEND,'N')='N' AND 
        NVL(STS.IS_CANCELLED_STATIUS,'N')='N'            
    ORDER BY STS.ACTION_SORT ASC
) X
WHERE ROWNUM = 1
        ;

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.