[英]Oracle SQL Query rownum inconsistent
以下查询结果对我来说似乎不一致。
select OUTCOME from (select OUTCOME, NUMBER1
from TASK
order by TASK_NUMBER desc)
where NUMBER1 = 1500
返回3行
1: (null)
2: Expected Outcome
3: Some other previous outcome
添加了ROWNUM=2
,这是我想要的行。
select OUTCOME from (select OUTCOME, NUMBER1
from TASK
order by TASK_NUMBER desc)
where NUMBER1 = 1500 and
ROWNUM=2
结果为1: (null)
而不是预期的1: Expected Outcome
如果我尝试使用ROWNUM=1
收到,那么在该实例中的期望值为1: (null)
如何连续检索中间行?
WHERE ROWNUM = X
或WHERE ROWNUM > X
的查询没有意义。 这是因为ROWNUM
值在谓词求值期间分配给行,并且仅在行通过WHERE
子句后才递增。
select OUTCOME from
(select OUTCOME, NUMBER1, ROWNUM RN from TASK order by TASK_NUMBER desc)
where NUMBER1 = 1500 and RN=2
编辑
实际上,上述解决方案是错误的,因为ROWNUM
将在ORDER BY
子句之前分配。 不使用ROW_NUMBER()
(如zaratustra的answer一样 ),正确的解决方案是:
select OUTCOME from (
select ROWNUM RN, OUTCOME, NUMBER1
from (select OUTCOME, NUMBER1 from TASK order by TASK_NUMBER desc)
) where NUMBER1 = 1500 and RN=2
ROWNUM在您的情况下是不可预测的,在rownum = n (n > 1)
或rownum > n
( n
是任何自然数)的情况下是不可访问的,您必须像这样使用ROW_NUMBER()
:
select OUTCOME
from (
select OUTCOME
, NUMBER1
, ROW_NUMBER() OVER(order by TASK_NUMBER desc) rn
from TASK
)
where NUMBER1 = 1500
and rn=2
ROWNUM = 2
(或ROWNUM > 1
)将始终导致找不到行。 在评估所有条件之后,将生成ROWNUM, 作为查询的行输出 ; 因此,查询的第一行输出被分配为ROWNUM 1,下一行被分配为ROWNUM 2,依此类推。因此,要求获得ROWNUM = 2
的行等同于要求get me the second row emitted from the query
中不会发生get me the second row emitted from the query
,因为ROWNUM = 2
比较意味着查询将永远不会出现第一行,该行将具有ROWNUM = 1
。
因此,我相信ROWNUM上唯一可行的比较是:
= 1
>= 1
< n
BETWEEN 1 and n
解决此问题的一种方法是将查询重写为:
select OUTCOME from (select OUTCOME, NUMBER1, ROWNUM as RNUM
from TASK
order by TASK_NUMBER desc)
where NUMBER1 = 1500 and
RNUM = 2
在这里,我们在内部查询中创建一个名为RNUM的临时列,为它分配内部查询生成的ROWNUM的值。 在外部查询中,我们测试RNUM是否等于2。
分享并享受。
行号是在运行时分配的,您可以通过匹配rownum来获取特定行。 您可以通过在子查询中包含rownum来实现此目的。 请使用以下查询:
select OUTCOME from (select OUTCOME, NUMBER1,ROWNUM RID from TASK order by TASK_NUMBER desc) where NUMBER1 = 1500 and RID=2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.