ChatGPT解决这个技术问题 Extra ChatGPT

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

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

SELECT user 
  FROM DUAL

...而且它会有 40 条记录。但我只需要一张唱片。 ...而且,我想在没有 WHERE 子句的情况下实现它。

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

SELECT FirstRow(user) 
  FROM DUAL
什么版本的甲骨文?使用 ROWNUM 或 ROW_NUMBER (9i+) 意味着需要 WHERE 子句
您是否命名了一个表 dual
@ypercube dual 是 oracle 中的系统表
@Ben,您真的不应该创建一个名为 DUAL 的表。它有点像 C 中的 #define TRUE 0 - 当然,它可能对您有用,但未来的开发人员会讨厌您。
您是否真的尝试过运行 select user from dual?如果没有,请尝试一下,看看你会得到什么。在标准的 oracle 系统上,您将获得正在执行命令的用户。

g
gdoron is supporting Monica

您使用 ROWNUM。

IE。

SELECT user FROM Dual WHERE ROWNUM = 1

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


@ypercube 据我所知,确实如此。 (至少它适用于我安装的 oracle10g。)
@bdares:它会起作用的,是的。但不是您的答案,使用 order by
是的。 ROWNUM 是一个特殊的列,它被添加到枚举结果的结果集中。您也可以使用它来选择多个,例如,如果您想找到 10 名薪酬最高的员工,您可以说“SELECT user FROM Employees WHERE ROWNUM <= 10 ORDER BY SALARY DESCENDING”
@mkdess:不,ORDER BYWHERE 之后应用。
您需要:SELECT * FROM (SELECT user FROM Employees ORDER BY SALARY DESC) WHERE ROWNUM <= 10
J
Jon Heller

此语法在 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 some_table 仅获取前 1 行;它在我的 swl devloper 和 sql plus 中都不起作用,因此在获取时出错。
你用的是oracle 12c吗?
我真的不知道,但是当我打开它时,它显示如下: SQL * PLus Release 10.1.0.4.2 is it not 12 c
正确 - 您使用的可能是 10.1.xxx 版本,您可以 SELECT * FROM V$VERSION
佚名

我发现这个“解决方案”隐藏在其中一条评论中。因为我查了一段时间,所以我想强调一下(还不能评论或做这样的事情......),所以这就是我使用的:

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

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


我发现如果您按 ROWID 订购它也可以,只要您从不删除任何记录并始终关心最后插入/修改的记录。
@vapcguy:不要指望 ROWID 是有序的,即使你从不从表中删除一行!即使它现在适用于您,也不能保证它在未来的版本中也适用。
@D.Mika 实际上,如果它现在有效,并且您从不添加/删除/更新/删除记录,那么应该永远不会有任何问题。只有在您实际更改记录时才能更改记录。有一种误解认为 ROWID 是由 Oracle 随机修改的。它不是。它基于实际修改行,即删除一行,然后插入一行。插入的将获得旧的 ROWID。有诸如永远不会更新的静态表之类的东西——美国的州就是一个很好的例子——如果它发生了变化,它可能会产生其他影响,无论如何,只要这没问题。
@vapcguy:嗯,那几乎是对的。但是还有其他操作会改变 ROWID。如果出于某种原因导出/导入表怎么办?还有其他操作,但其中一些需要启用行移动。我只想说,依赖未来可能会改变的实现细节并不是一个好主意。
@D.Mika 我敢肯定,如果有任何操作可以更改 ROWID,一个好的 DBA 会查找它们并尽其所能避免它们,如果它们有可能影响这样的静态表,例如我描述了只有应用程序才能运行。相反,可以使用 SELECT 语句来完成表导出。导入会发生一次,然后再也不会发生。我明白你的意思,绝对需要小心,但这些问题远非不可避免。
M
Massimiliano Kraus

我们有 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

感谢您的回答:在第 3 点下)“nowrum = 1”可能应该更改为“rownum = 1”。
F
Fuat

👌 答案是:

您应该使用嵌套查询:

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 有一些奇怪的问题,但我们不应该让旧的错误再影响我们的代码。
@hgwhittle,Fuat 正确的原因是因为 ROWNUM 不关心“ordery by”,它只是抓取它可以找到的第一条记录并立即返回它。所以换句话说,ROWNUM 限定符对“Order By”命令没有任何尊重。我希望不是这样,但 Fuat 是正确的,使用嵌套查询。
y
ypercubeᵀᴹ

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

SELECT user
FROM dual

这不是真的 select user from dual 应该给你所有的用户
.. 并且刚刚在我的系统上试用过,可以作为 ypercube 和所有相关文档提及。 @本
@Ben dual 不是目录视图,它不会显示“所有用户”。为此,您将使用像 ALL_USERS 这样的视图。
O
Oh Chin Boon

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


g
gdoron is supporting Monica

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

select * from dual where rownum = 1;

请注意,与 ORDER BY 结合使用时,这将无法按预期工作,因为排序仅发生在 where 子句之后。换句话说,要获得某个排序查询的顶部,rownum 完全没用。
@Nyerguds,这只是对了一半。您可以将 Where 之前的 order by 与 View 查询一起使用。
什么,所以SELECT * FROM (SELECT * FROM ... WHERE ... ORDER BY ...) WHERE ROWNUM = 1?好吧,这可能有效,但它看起来很愚蠢,tbh。
D
David Buck

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

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

其中 sysdate_col 将是您想要排序的任何列的名称,当然,table_name 将是您希望排序数据来自的表的名称。
R
Raihan

如果有任何行可以,请尝试:

select max(user)  
from table;

没有 where 子句。


当然,您只需几秒钟即可亲自尝试
A
Andrew
select name, price
  from (
    select name, price, 
    row_number() over (order by price) r
      from items
  )
where r between 1 and 5; 

M
MaartenDev

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(...),因为不需要分组。


J
John Dvorak

select max() 更灵活的是:

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