如何从oracle sql中只选择1行?

时间:2012-01-19 00:22:11

标签: sql oracle oracle9i

我想使用oracle语法从表DUAL中仅选择1行。例如,我想执行此查询:

SELECT user 
  FROM DUAL

......它有40条记录。但我只需要一条记录。 ......而且,我想在没有WHERE条款的情况下实现它。

我需要table_name字段中的内容,例如:

SELECT FirstRow(user) 
  FROM DUAL

13 个答案:

答案 0 :(得分:146)

您使用ROWNUM。

即。

SELECT user FROM Dual WHERE ROWNUM = 1

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

答案 1 :(得分:35)

我找到了这个"解决方案"隐藏在其中一条评论中。由于我正在查找一段时间,我想稍微强调一下(不能评论或做这样的事情......),所以这就是我用的:

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

这将从表中的最新条目打印出所需的[Column]条目,假设始终通过SYSDATE插入[Date]。

答案 2 :(得分:25)

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;

^^我只是想证明无论多少行所需的行数,都可以使用行或行(复数)。)

答案 3 :(得分:7)

据我所知,Oracle中的dual表是一个只有一行的特殊表。所以,这就足够了:

SELECT user
FROM dual

答案 4 :(得分:5)

Oracle中没有limit 1条件(即MySQL / PostgresQL),您需要指定where rownum = 1

答案 5 :(得分:5)

“FirstRow”是一个限制,因此它在where子句中的位置不在select子句中。它被称为rownum

select * from dual where rownum = 1;

答案 6 :(得分:5)

答案是:

您应该使用嵌套查询:

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

=>在PL / SQL中,“ROWNUM = 1”不等于TSQL的“TOP 1”。

所以你不能使用这样的查询:“select * from any_table_x,其中rownum = 1 order by any_column_x;”因为oracle获取第一行然后应用order by子句。

答案 7 :(得分:5)

我们有3个选择来获取Oracle DB表中的第一行。

1)select * from table_name where rownum= 1是最好的方法

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

3)

    select * from 
         ( select * from table_name order by id )

   where nownum= 1    

答案 8 :(得分:2)

如果有任何行,请尝试:

select max(user)  
from table;

没有where子句。

答案 9 :(得分:1)

select name, price
  from (
    select name, price, 
    row_number() over (order by price) r
      from items
  )
where r between 1 and 5; 

答案 10 :(得分:1)

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

效果最佳,另一种选择是:

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

在需要不同子集的情况下,但我想您也可以使用RANK()。但是,我也喜欢row_number() over(...),因为不需要分组。

答案 11 :(得分:1)

如果您只想返回排序结果的第一行,且子查询最少,请尝试以下操作:

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

答案 12 :(得分:-1)

select max()更灵活:

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