Oracle SQL Query rownum不一致

时间:2014-08-21 14:29:32

标签: sql oracle

以下查询结果似乎与我不一致。

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)

如何一致地检索该中间行?

4 个答案:

答案 0 :(得分:6)

  

使用WHERE ROWNUM = XWHERE ROWNUM > X的查询没有意义。   这是因为在期间为行分配了ROWNUM值   谓词评估,只有在一行通过后才会增加   WHERE条款。

source

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 nROW_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