我无法理解为什么某些功能在我的Oracle sql Developer中无效。我试图选择行号2,但Oracle只返回一个空行。
但是当我使用行号1时,Oracle返回第一行,如果我指定行号< = 2,则Oracle返回第1行和第2行。反之亦然,行号> = 2顺便说一句FETCH和偏移返回错误
select *
from PAS.TRANSACTION
where msisdn in ('1112684179')
and rownum = 2
order by INSERTION_DATE DESC;
答案 0 :(得分:0)
它不起作用是因为:对于第一行,它针对ROWNUM
的{{1}}进行了测试,在这种情况下,1
为false,并且该行被丢弃。由于该行已被废弃,因此未分配ROWNUM = 2
,而是针对ROWNUM
ROWNUM
的同一1
测试下一行;循环重复,ROWNUM = 2
为假,行被丢弃。重复,恶心和所有行都未通过WHERE
测试并被丢弃。
如果你想获得第二行,那么你需要在内联视图中为每一行分配一个ROWNUM
,然后在处理完之后再选择第二行。
SELECT * -- Finally, in the outer select get
-- the 2nd row
FROM (
SELECT t.*, -- Second, having ordered the rows
ROWNUM AS rn -- then generate the row numbers
(
select * -- Fisrt, in the inner-most inline
from PAS.TRANSACTION -- view, select the rows you want
where msisdn in ('1112684179') -- and apply the order.
order by INSERTION_DATE DESC
)
)
WHERE rn = 2;
(另请注意,{<1}}伪列是在生成之前生成的 - 所以如果您希望它先订购,然后根据该订购编号然后你需要在内联视图中订购并在下一步生成ROWNUM
- 如上例所示。)