Почему Oracle меняет rowid на fetch? - PullRequest
0 голосов
/ 30 мая 2019

У меня такой запрос:

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

Но когда я использую fetch (для производительности), возвращаемый идентификатор строки отличается:

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

Почему fetch изменяет rowid?Для меня это не имеет смысла.

Обновление

Когда используется выборка, этот идентификатор строки возвращается из таблицы B, а не из таблицы A.

row id from 3 tables

1 Ответ

5 голосов
/ 30 мая 2019

В tableA есть две строки с одинаковым значением wacLogin (но, очевидно, разными значениями rowID). Ни один из ваших запросов не указывает order by, поэтому, какая из этих строк возвращается, является произвольной. Предположительно, для обоих запросов используется немного другой план запроса, поэтому каждый из них возвращает различную произвольную строку. Конечно, завтра один или оба запроса могут начать возвращать другую произвольную строку, если план запроса или физическая организация таблицы изменятся. Если вы хотите, чтобы в обоих случаях возвращалась одна и та же строка, вам нужно сделать оба запроса детерминированными с помощью предложения order by, которое однозначно упорядочивает результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...