我想使用oracle语法从表DUAL
中仅选择1行。例如,我想执行此查询:
SELECT user
FROM DUAL
......它有40条记录。但我只需要一条记录。 ......而且,我想在没有WHERE
条款的情况下实现它。
我需要table_name字段中的内容,例如:
SELECT FirstRow(user)
FROM DUAL
答案 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