以下查询结果似乎与我不一致。
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)
如何一致地检索该中间行?
答案 0 :(得分:6)
使用
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's 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
答案 1 :(得分:1)
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
,如下所示:
{{1}}
答案 2 :(得分:1)
ROWNUM = 2
(或ROWNUM > 1
)始终不会导致找到任何行。在评估完所有条件后,在查询输出行时生成ROWNUM ; ;因此,查询的第一行输出被分配为ROWNUM 1,下一个获得ROWNUM 2,等等。因此,要求ROWNUM = 2
等于要求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.
分享并享受。
答案 3 :(得分:0)
行号在运行时分配,您可以通过匹配rownum来获取特定行。 您可以通过在子查询中包含rownum来实现此目的。请使用以下查询:
select OUTCOME from (select OUTCOME, NUMBER1,ROWNUM RID from TASK order by TASK_NUMBER desc) where NUMBER1 = 1500 and RID=2