结合排序、选择进入和 where 语句以在 oracle sql 中查找最大值

Posted

技术标签:

【中文标题】结合排序、选择进入和 where 语句以在 oracle sql 中查找最大值【英文标题】:combining a sort, select into, and where statement to find a max value in oracle sql 【发布时间】:2013-08-04 02:29:37 【问题描述】:

我正在尝试执行 select into 语句以从列中获取最大值。这就是我所拥有的:

   SELECT stdid INTO v_stdid 
   FROM (SELECT stdid FROM STUDENT ORDER BY stdid DESC)
   WHERE ROWNUM = 1;

虽然我没有得到正确的值。它应该是 32,但返回的是 9(我有一个 dbms_output_line(v_stdid) 来检查该值。当我将顺序更改为 ASCENDING 我的值更改时,所以我知道发生了一些事情。但是为什么我不能得到正确的最大值?我觉得排序一定没有正确完成。

谢谢!

【问题讨论】:

我面前没有oracle,但你试过SELECT max(stdid) INTO v_stdid 感谢 Nilesh - 我试过了,但仍然得到错误的值(9 而不是 32)。 嗨,Nilesh - 现在 max 可以工作了。 :) 我试图在 varchar 值上使用 max,所以这让我很困惑。我使用了它并且它起作用了: select max(to_number(stdid)) into v_stdid from student;再次感谢! +1 - 找到自己的答案 ORDER BY function not working in Oracle的可能重复 【参考方案1】:

看来TOP关键字可能对你有帮助。

SELECT stdid INTO v_stdid
FROM (SELECT TOP 1 FROM STUDENT ORDER BY stdid DESC);

我相信这可以消除您遇到的问题,方法是将第二次选择的前 1 个结果的 stdid 返回到 v_stdid,而不必担心 NUMROW 所具有的一些复杂性,如下所示:

Selecting the second row of a table using rownum

【讨论】:

感谢 Mattpic - 不幸的是不能使用 TOP 关键字。这似乎是针对 SQL Select 的。我发现一篇文章说,相当于 TOP 的 Oracle 正在使用 ROWNUM,但就像您提供的链接指出的那样,ROWNUM 会产生自己的问题。 很高兴我能提供帮助,但没有意识到您使用的是 Oracle。简单的解决方法,但是如果您将 ROWNUM 放在括号内,是否可以解决问题? 将 ROWNUM 添加到子查询也不起作用,因为它在排序之前应用,因此子查询不会重新调整最大值。【参考方案2】:

你可以这样做:

SELECT max(stdid) INTO v_stdid 
FROM STUDENT;

但是,我相信您的问题是 stdid 被存储为字符而不是数字。因此,将其转换为整数:

select max(cast(stdid as int)) into v_stdid
from student;

这也适用于您的原始公式:

SELECT stdid INTO v_stdid 
FROM (SELECT stdid FROM STUDENT ORDER BY cast(stdid as int) DESC)
WHERE ROWNUM = 1;

【讨论】:

以上是关于结合排序、选择进入和 where 语句以在 oracle sql 中查找最大值的主要内容,如果未能解决你的问题,请参考以下文章

ORA:01467 排序键太长

在 R 脚本中为 R 变量使用 where 子句以在 SQL 语句中使用它

ORA-01722: 无效的数字 where 子句

简单选择语句的where子句中的MySQL未知列

当 EXECUTE IMMEDIATE 没有返回任何行时,“ORA-01007:变量不在选择列表中”

Where 子句案例陈述; ORA-00907: 缺少括号