从工资中选择rownum,其中rownum = 3;
Posted
技术标签:
【中文标题】从工资中选择rownum,其中rownum = 3;【英文标题】:select rownum from salary where rownum=3; 【发布时间】:2010-08-11 10:25:50 【问题描述】:如何使用“rownum”关键字从任何表中检索第三行(我使用的是 oracle-10g)
【问题讨论】:
@Jagan,你的 RDBMS 是什么?请提供'Select s.*, rownum from Salary s'的结果。 在不知道您的架构或(至少)一些发生问题的示例数据的情况下,我们如何猜测您的问题是什么? -1 如果查询(即您的标题)是正确的,那么答案是包含 3 的单行!! 更多标签会更好。我假设您使用的是 Oracle。 @Mitch Wheat - 您的评论是合乎逻辑和合理的,但不是您在 Oracle 中可以找到的。 Oracle 在查询“吐出”行时分配 ROWNUM 值(实际上,在评估 WHERE 子句之后) - 因此,在 ROWNUM=1 和 ROWNUM=2 的行之前不会有 ROWNUM=3 的行产生。这是一种追尾的事情——查询正在寻找 ROWNUM=3,但唯一可以生成的行(因为它显然是在寻找单行)将有 ROWNUM=1——因此,没有结果完全生产。 【参考方案1】:Oracle 在查询生成行时按顺序将值分配给 ROWNUM - 因此,获取的第一行获取 ROWNUM=1,获取的第二行获取 ROWNUM=2,获取的第三行获取 ROWNUM=3,等等。注意 -对于要分配 ROWNUM=3 的行,必须获取前两行。这就是您的查询不返回任何行的原因。您正在向数据库询问已提取的第三行 - 但从未提取过第 1 行和第 2 行。
为了演示,请尝试运行以下查询:
SELECT S.* FROM SALARY S; -- Should return all rows
SELECT ROWNUM, S.* FROM SALARY S; -- Should return all rows with ROWNUM prepended
SELECT ROWNUM, S.* FROM SALARY WHERE ROWNUM=3; -- Should return no rows
要解决您的问题,请尝试以下方法:
SELECT ROW_NUMBER FROM
(SELECT ROWNUM AS ROW_NUMBER, S.* FROM SALARY S)
WHERE ROW_NUMBER = 3;
分享和享受。
【讨论】:
【参考方案2】:你会 need to do 这样的东西
select rnum,sal
from
( select sal, rownum rnum
from salary
order by sal desc )
where rnum = 3;
rownum
直到在谓词阶段之后才被分配,因此rownum = 3
将始终为 false。使用 CTE 或派生表,然后您可以从外部访问 rownum
。
【讨论】:
select rownum,sal from (select sal from Salade order by sal desc ) where rownum = 3;这个东西我已经试过了....但答案是“找不到数据”【参考方案3】:SELECT ROW_NUMBER FROM (SELECT ROWNUM AS ROW_NUMBER, S.* FROM SALARY S) WHERE ROW_NUMBER = 3;
这是不正确的。这将始终返回“3”,因为您选择的是 ROW_NUMBER。
应该改为“select *”,如下所述:
select * from (select rownum as row_number, s.* from salary s) where row_number = 3;
【讨论】:
【参考方案4】:rownum 是您薪水表中的实际列吗?如果不支持,根据您的数据库类型,可能不支持 rownum。
【讨论】:
从工资 rownum 数据如下 a , 1000 b , 2000 c , 3000 d ,4000 e , 5000 f , 6000 e , 7000 select *from 工资 C S a 1000 b 2000 c 3000 d 4000 e 5000 f 6000 g 7000以上是关于从工资中选择rownum,其中rownum = 3;的主要内容,如果未能解决你的问题,请参考以下文章
如何从oracle sql中的选择计数中对rownum使用case语句?