我想使用 oracle 语法从表 DUAL
中仅选择 1 行。例如,我想执行这个查询:
SELECT user
FROM DUAL
...而且它会有 40 条记录。但我只需要一张唱片。 ...而且,我想在没有 WHERE
子句的情况下实现它。
我需要 table_name 字段中的一些内容,例如:
SELECT FirstRow(user)
FROM DUAL
dual
?
dual
是 oracle 中的系统表
DUAL
的表。它有点像 C 中的 #define TRUE 0
- 当然,它可能对您有用,但未来的开发人员会讨厌您。
select user from dual
?如果没有,请尝试一下,看看你会得到什么。在标准的 oracle 系统上,您将获得正在执行命令的用户。
您使用 ROWNUM。
IE。
SELECT user FROM Dual WHERE ROWNUM = 1
http://docs.oracle.com/cd/B19306_01/server.102/b14200/pseudocolumns009.htm
此语法在 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;
^^我只是想证明可以使用行或行(复数),而不管所需的行数是多少。)
我发现这个“解决方案”隐藏在其中一条评论中。因为我查了一段时间,所以我想强调一下(还不能评论或做这样的事情......),所以这就是我使用的:
SELECT * FROM (SELECT [Column] FROM [Table] ORDER BY [Date] DESC) WHERE ROWNUM = 1
这将从表中的最新条目中打印出所需的 [Column] 条目,假设始终通过 SYSDATE 插入 [Date]。
ROWID
订购它也可以,只要您从不删除任何记录并始终关心最后插入/修改的记录。
ROWID
是由 Oracle 随机修改的。它不是。它基于实际修改行,即删除一行,然后插入一行。插入的将获得旧的 ROWID
。有诸如永远不会更新的静态表之类的东西——美国的州就是一个很好的例子——如果它发生了变化,它可能会产生其他影响,无论如何,只要这没问题。
ROWID
,一个好的 DBA 会查找它们并尽其所能避免它们,如果它们有可能影响这样的静态表,例如我描述了只有应用程序才能运行。相反,可以使用 SELECT
语句来完成表导出。导入会发生一次,然后再也不会发生。我明白你的意思,绝对需要小心,但这些问题远非不可避免。
我们有 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 rownum = 1
👌 答案是:
您应该使用嵌套查询:
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 where rownum=1 order by any_column_x;”因为 oracle 获取第一行然后应用 order by 子句。
rownum = 1
有一些奇怪的问题,但我们不应该让旧的错误再影响我们的代码。
据我所知,Oracle 中的 dual
表是一个只有一行的特殊表。所以,这就足够了:
SELECT user
FROM dual
Oracle 中没有 limit 1
条件(即 MySQL / PostgresSQL),您需要指定 where rownum = 1
。
“FirstRow”是一个限制,因此它位于 where
子句而不是 select
子句中。它被称为rownum
select * from dual where rownum = 1;
ORDER BY
结合使用时,这将无法按预期工作,因为排序仅发生在 where 子句之后。换句话说,要获得某个排序查询的顶部,rownum 完全没用。
Where
之前的 order by 与 View 查询一起使用。
SELECT * FROM (SELECT * FROM ... WHERE ... ORDER BY ...) WHERE ROWNUM = 1
?好吧,这可能有效,但它看起来很愚蠢,tbh。
如果您只想返回具有最少子查询的排序结果的第一行,请尝试以下操作:
select *
from ( select a.*
, row_number() over ( order by sysdate_col desc ) as row_num
from table_name a )
where row_num = 1;
如果有任何行可以,请尝试:
select max(user)
from table;
没有 where 子句。
select name, price
from (
select name, price,
row_number() over (order by price) r
from items
)
where r between 1 and 5;
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(...)
,因为不需要分组。
比 select max()
更灵活的是:
select distinct first_row(column_x) over (order by column_y,column_z,...) from Table_A
order by
。ORDER BY
在WHERE
之后应用。SELECT * FROM (SELECT user FROM Employees ORDER BY SALARY DESC) WHERE ROWNUM <= 10