Порядок Oracle по неопределенным - PullRequest
3 голосов
/ 28 сентября 2011

Я пытаюсь добавить нумерацию страниц к простому запросу на выборку, например

select rownum rownum_,t.* from (select id,name from table) t
where rownum <=4

Однако приведенный выше запрос ведет себя по-разному, когда условие существует, а условие отсутствует. Но при удалении столбца имени, поведение является последовательным. Кто-нибудь может сказать почему?

Я понимаю, что rownum определяется при выполнении запроса, но я не могу понять, что условие where с rownum <= n меняет порядок </p>

Ответы [ 3 ]

6 голосов
/ 28 сентября 2011

Вы должны понимать, что rownum - псевдостолбец.

Столбец rownum в вашем запросе указывает порядок (первая запись, вторая, третья ...)

Тогда порядок записей, возвращаемый

select id,name from table

, не гарантируется.В вашем запросе значение rownum, связанное с первой записью, всегда будет 1, несмотря на тот факт, что первая запись может каждый раз отличаться.

В заключение всегда используйте ORDER BY, когда вам нужен конкретный заказ.

5 голосов
/ 28 сентября 2011

Таблица может иметь индекс на rownum, который она использует, когда вы ограничиваете rownum <= 4.Порядок, скорее всего, будет определяться индексом.По крайней мере, так работает в MySQL.Если вы хотите конкретный заказ, всегда используйте ORDER BY.

2 голосов
/ 28 сентября 2011

Когда вы исключаете столбец name из запроса, значения идентификатора извлекаются из индекса, а не из таблицы, поэтому вы получаете другой заказ.

Вторая проблема, которую я поставил, заключается в том, что оптимизатор использует параллель для получения большего количества строк. Параллельные потоки всегда возвращают «порядок беспорядка», потому что они получают данные параллельно, а не последовательно. Попробуйте с подсказкой /*+ NO_PARALLEL(table) */

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