为什么=运算符不能与ROWNUM一起使用而不是值1?

时间:2012-03-13 05:57:16

标签: sql oracle11g

我有以下查询:

select * from abc where rownum = 10

输出:无记录显示

我确实在abc表中有超过25条记录,我的目标是显示第n条记录。

如果我将查询编写为: -

select * from abc where rownum = 1

它工作正常并给我第一个记录。除了第一个以外没有任何其他记录。

有什么想法吗?

1 个答案:

答案 0 :(得分:19)

因为行号是按行返回的行顺序分配的。

以下是你的陈述如何运作。它抓住第一个候选行并暂时给它第1行,这与你的条件不符,所以它被扔掉了。

然后你得到了第二个候选行,它的也给了第1行(因为前一个被扔掉了)。它也不匹配。

然后是第三个候选行...好吧,我相信你现在可以看到它的发展方向。简而言之,您永远不会找到满足该条件的行。

行号仅对= 1< something<= something有用。

这一点在Oracle docs for the rownum pseudo-column中解释。

您还应该记住,SQL是一个关系代数,它返回无序集,除非您指定一个订单。这意味着第十行可能是现在的东西,而在三分钟内就可能出现其他情况。

如果你想要(kludgy,不可否认)获得n行的方法,你可以使用类似的东西(第五行):

select * from (
    select * from (
        select col1, col2, col3 from tbl order by col1 asc
    ) where rownum < 6 order by col1 desc
) where rownum = 1

内部选择将确保您在开始丢弃行之前在查询上具有一致的顺序,并且中间选择将丢弃除了前五行之外的所有行,并且还反转顺序。

外部选择将只返回反转集的第一行(当它按升序排列时,是五行集的最后一行)。

更好的方法可能是:

select * from (
    select rownum rn, col1, col2, col3 from tbl order by col1
) where rn = 5

这可以通过检索所有内容并将rownum分配到“真实”列,然后使用该实际列号来过滤结果来实现。