我有以下查询:
select * from abc where rownum = 10
Run Code Online (Sandbox Code Playgroud)
输出:无记录显示
我肯定在abc表中有超过25条记录,我的目标是显示第n条记录.
如果我将查询写为: -
select * from abc where rownum = 1
Run Code Online (Sandbox Code Playgroud)
它工作正常,给了我第一个记录.除了第一个以外没有任何其他记录.
任何的想法?
pax*_*blo 19
因为行号按顺序分配给提取和返回的行.
以下是您的陈述如何运作.它抓住第一个候选行并临时给它第1行,这与你的条件不匹配所以它被扔掉了.
然后你得到第二个候选行,它也被赋予第1行(因为前一个被扔掉了).它也不匹配.
然后是第三个候选行...好吧,我相信你现在可以看到它的发展方向.简而言之,您永远不会找到满足该条件的行.
行数都是只对有用的= 1
,< something
或<= something
.
这些都在针对rownum
伪列的Oracle文档中进行了解释.
您还应该记住,SQL是一个关系代数,它返回无序集,除非您指定一个顺序.这意味着第10行可能是现在的东西,而在三分钟内可能是其他东西.
如果你想要一个(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
Run Code Online (Sandbox Code Playgroud)
内部选择将确保您在开始丢弃行之前在查询上具有一致的顺序,并且中间选择将丢弃除了前五行之外的所有行,并且还反转顺序.
然后外部选择将仅返回反转集的第一行(当它按升序排列时是五行集的最后一行).
更好的方法可能是:
select * from (
select rownum rn, col1, col2, col3 from tbl order by col1
) where rn = 5
Run Code Online (Sandbox Code Playgroud)
这通过检索所有内容并将rownum分配给"真实"列,然后使用该实际列号来过滤结果来工作.