2015-06-18 3 views
0

Я наблюдал странное поведение с ROWNUM в Oracle со статическими таблицами. Я пытаюсь пагинации с запросом, как показано нижеПоведение rownum в Oracle

select * from (
    select the_data,rownum as seqn from the_table 
) where seqn <= somenumber and seqn >= othernumber 

Однако, когда я выполнить запрос несколько раз я замечаю, что значение ROWNUM возвращается не является уникальным для строки, т.е. если строка появляется в ROWNUM 25 впервые он появляется в ROWNUM 125 для второго исполнения

Эта проблема не появляется, если я делаю заказ, как,

select * from (
    select the_data,rownum as seqn from the_table order by column3 
) where seqn <= somenumber and seqn >= othernumber 

Однако заказ по снижает производительность. Это нормально или есть какой-либо другой способ повысить производительность.

+1

Это FAQ. Вы получите ответ в вопросе, который я обозначил как дубликат. В вашем первом запросе в подзапросе нет ** ORDER BY **, поэтому нет ** гарантии ** порядка упорядоченных строк. –

+0

@Lalit Kumar B Но для статической таблицы следует, чтобы rownum не был таким же каждый раз, когда вы запускали запрос –

+0

** NO **, никогда. «ROWNUM» - псевдо-столбец, который присваивается строке после прохождения фазы предиката. Строки не сохраняются в каком-либо порядке, ни они не выбираются в любом порядке. Чтобы обеспечить заказ, вы ДОЛЖНЫ всегда указывать ** ORDER BY **. –

ответ

-1

Вы должны проверить документы оракула по этому вопросу. Круги ссылка может быть полезна для вас http://docs.oracle.com/cd/E11882_01/server.112/e41084/functions156.htm#SQLRF06100

One example: 
SELECT * FROM (SELECT ROW_NUMBER() OVER() AS R, T.* FROM T) AS TR WHERE R <= 10; 


T является именем таблицы. R - это строка

+0

Чтобы ограничить количество строк, возвращаемых из запроса к 10 первых строк таблицы T, используйте следующий запрос: 'SELECT * FROM ( ВЫБОР ROW_NUMBER (НАД)() AS R, Т. * FROM T ) AS TR WHERE R <= 10; ' ** T - имя таблицы. R является строкой ** – Khamill

+0

@Khamill, но будет ли она оставаться постоянной, когда запрос выполняется несколько раз, и в запросе не требуется порядок –

Смежные вопросы