为什么Oracle用fetch更改rowid?

时间:2019-05-29 23:41:10

标签: oracle plsql

我有这样的查询:

select w.rowid, w.waclogin
  from tableA w, tableB wa, tableC a
 where wa.alucod = a.alucod
   and w.waclogin = wa.waclogin
   and a.cpf = '31808013875'
   and rownum <= 1;

结果是:

ROWID               WACLOGIN
AAA0CEAHSAABE07ABA  31808013875

但是当我使用访存(出于性能考虑)时,返回的rowid是不同的:

select w.rowid, w.waclogin
  from tableA w, tableB wa, tableC a
 where wa.alucod = a.alucod
   and w.waclogin = wa.waclogin
   and a.cpf = '31808013875'
 fetch first row only;

结果:

ROWID               WACLOGIN
AAA0DMAHaAAA+ZcAAX  31808013875

为什么抓取会更改rowid? 对我来说,这没有道理。

更新

使用提取时,返回的行ID来自表B,而不是表A。

row id from 3 tables

1 个答案:

答案 0 :(得分:5)

tableA中有两行具有相同的wacLogin值(但显然具有不同的rowID值)。您的查询均未指定order by,因此返回的那些行是任意的。大概,两个查询使用的查询计划略有不同,因此每个查询返回一个不同的任意行。当然,明天,如果查询计划或表的物理组织发生变化,则其中一个查询或两个查询都可以开始返回不同的任意行。如果您希望在两种情况下都返回同一行,则需要使用order by子句来确定两个查询的确定性,该子句唯一地对结果进行排序。