Oracle数据库的rownum为什么会出现这个问题?

发布于 2022-09-05 03:32:48 字数 843 浏览 23 评论 0

我有一个“亲子关系”的一张表parentage

SQL> select * from parentage;

FATHER     CHILD
---------- ----------
David      Cindy
David      Tony
Tom        Amy
Tom        Bob
Tom        Nick

为了练习rownum关键字,我想输出前两行,如下语句可以正确运行:

SQL> select * from parentage where rownum<=2;

FATHER     CHILD
---------- ----------
David      Cindy
David      Tomy

但是但我想输出第二行后面的所有行时,结果有异常:

SQL>  select * from parentage where rownum>2;

未选定行

系统提示未选定行,为什么呢?明明表中有5行啊?
还有,我想输出第二行和第三行时:


SQL> select * from parentage where rownum between 2 and 3;

未选定行

SQL> select * from parentage where rownum>=2 and rownum<=3;

未选定行

这是为什么呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

萤火眠眠 2022-09-12 03:32:49

rownum是Oracle系统顺序分配给查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,而且rownum不能以任何表的名称作为前缀。

WHERE子句的操作,是筛选数据,不满足的去掉。
又因为,rownum是返回结果中的顺序计数,如果去掉一行,后面计数会全部-1
所以,如果rownum >= 2,那么第一行就不满足,去掉之后原来rownum = 2的行,现在成了rownum = 1,所以这样一直到所有的行都被清完,仍然不会满足。

所以,当所有的行清完都没有满足条件时,就会报错:未选择行

携余温的黄昏 2022-09-12 03:32:49

@boxsnake 已经把rownum的内在含义说清楚了,想要达到你的目的,可以这样写:

select * from (
  select t.*, rownum as rn from parentage t
) where rn > 2
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文