Oracle未定的订单

Rne*_*net 3 oracle

我正在尝试将分页添加到简单的选择查询中,例如

select rownum rownum_,t.* from (select id,name from table) t
where rownum <=4
Run Code Online (Sandbox Code Playgroud)

但是,当条件存在且条件不存在时,上述查询的行为会有所不同.但是在删除名称列时,行为是一致的.有谁能说出原因?

我知道rownum是在运行查询时确定的,我无法理解的是rownum <= n的where条件会改变顺序

Luc*_*c M 6

你必须明白这rownum是一个伪列.

rownum查询中的列表示订单(第一个记录,第二个,第三个......)

然后返回记录顺序

select id,name from table
Run Code Online (Sandbox Code Playgroud)

不保证.在您的请求中,与第一条记录关联的rownum将始终为1,因为第一条记录每次都可能不同.

总之,总是ORDER BY在您想要特定订单时使用.


Kus*_*nda 5

rownum当您使用限制时,该表可能有一个索引rownum <= 4.然后订单可能由索引定义.至少这是它在MySQL中的工作方式.如果您想要特定的订购,请始终使用ORDER BY.

  • @Rnet,解决方案是在需要特定订购时始终使用`ORDER BY`.没有默认排序,订单可能会受到可用索引的影响,和/或数据插入表中的顺序. (6认同)
  • 在Oracle中,`rownum`是一个伪列,在创建结果集之前它永远不会有值,因此不可能有索引. (4认同)