Re: постраничный вывод

From
Andrey Prokopenko ()
To
Sergey M ()
Date
2002-07-15T10:35:36Z
Area
RU.DBMS.ORACLE
@Header= RU.RDBMS.ORACLE (2:454/17.5) RU.RDBMS.ORACLE @Align{79}{=}
@Header Сооб : @Msgno из @Msgs@Align{44}@Attr
@Header От   : Sergey M                            2:5020/400          10 Июл
02 08:59
@Header Кому : Mikhail Skorjukov
@Header Тема : Re: постраничный вывод
@Header@Align{79}{=}
   Привет Sergey!

10 Июл 02 08:59, Sergey M -> Mikhail Skorjukov:

 SM> Привет!

 SM> "Mikhail Skorjukov" <skormik@bc.artelecom.ru> wrote in message
 SM> news:age8lj$10i$1@Sonix.atnet.ru...
 >> вопрос такой: имеется sql запрос, скажем, простой select, который
 >> возвращает, к примеру, 150 строк. mySQL имеет для этого оператор
 SM> limit. Можно ли средствами ораклового SQL ограничить вывод этих строк
 SM> не только по верхнему пределу (rownum), но и по нижнему, то
 SM> есть
 >> вывести строки с 50 по 75?

 SM> Если у тебя Оракл 8.1.x и выше, то можно использовать row_number().
 SM> Пример с стандартной схемой SCOTT:

 SM> select *
 SM>   from (SELECT deptno, ename, hiredate
 SM>              , ROW_NUMBER() OVER (ORDER BY hiredate) AS emp_id
 SM>           FROM emp
 SM>         )
 SM>   where emp_id between  10 and 15

Попробовал вариант с row_num на большой табличке, увы для запроса с применением
этой ф-ции
получается FULL SCAN таблички, а вот для моего варианта full scan нужного
индекса, что ессно намного легче.
Индекс у меня по col_date неуникальный. Ставил хинт USE INDEX на столбец
используемый
в order by - не помогает.
А функция удобная, особенно для нумерации групп, поэтому хочется выяснить как
избавиться от full scan таблички.
Понятное дело, если бы индекс был бы уникальным, то дело бы облегчилось ...

Вариант запроса с row_num:
 select *
   from (SELECT col1, col_date,
              , ROW_NUMBER() OVER (ORDER BY hiredate) AS row_id
           FROM emp
         )
   where row_id between 990 and 1000
-----------------------------
Мой вариант запроса такой:

select * from (
select n.*,rownum as row_num from (
select col1, col_date from my_table order by col_date
)n where rownum <=1000
) where row_num >=990


    До свидания, Andrey.

--- GoldED+/W32 1.1.4.7
 * Origin: Cross of Changes (2:454/17.5)
SEEN-BY: 50/523 993 51/7 450/9 22 69 102 451/5 10 30 30 452/25 453/129 454/1
SEEN-BY: 454/1 2 2 3 5 6 17 17 457/7 461/33 640 463/220 464/34 36 465/204
SEEN-BY: 466/20 467/70 95 469/125 550/5068 4615/21 4623/55 4625/9 4626/6
SEEN-BY: 4631/13 4641/444 4643/19 4653/10 4657/50 5000/5000 5001/27 77
SEEN-BY: 5002/5002 5003/9 34 5004/16 5005/44 5006/1 5009/9 5010/70 77 222
SEEN-BY: 5011/13 5012/1 5015/4 28 5019/22 28 5020/20 37 52 52 69 79 104 114
SEEN-BY: 5020/115 128 150 175 194 238 238 348 362 392 400 423 496 642 647
SEEN-BY: 5020/732 753 758 760 768 902 921 982 1057 1100 1169 1200 1212 1234
SEEN-BY: 5020/1301 1423 1423 1535 1626 1642 1694 1873 1930 1951 2020 2200
SEEN-BY: 5020/3637 4400 4441 5021/3 29 5022/5 5023/11 5025/3 5026/45 78
SEEN-BY: 5028/51 5029/1 50 5030/115 175 195 251 382 448 613 757 920 953 1016
SEEN-BY: 5030/1023 1400 1900 5031/26 5032/6 16 5033/1 5034/1 5035/10 5036/1
SEEN-BY: 5036/13 5037/21 5038/7 5040/33 47 5041/4 5042/8 5045/7 42 5049/64
SEEN-BY: 5049/125 5050/9 5051/35 5052/4 5053/16 18 777 5054/1 9 10 30 37 50
SEEN-BY: 5054/79 5056/16 5058/24 1000 5059/10 5060/90 5061/6 15 5063/27 60
SEEN-BY: 5064/5 7 35 36 5066/18 5069/128 5070/26 66 5071/1 5075/10 5077/3
SEEN-BY: 5078/20 5079/36 45 49 5080/80 111 301 5081/3 5082/6 5083/13 21
SEEN-BY: 5085/13 75 5090/2 91 1029 5091/100 5093/27 5095/1 5100/8 113 6009/8
SEEN-BY: 6023/1 6028/1 6035/1 6037/1 6083/1
PATH: 454/17 1 2 451/30 5020/1423 238 52 5054/1 79