ROWNUM

JackVlg
Дата: 26.02.2007 19:06:50
Здравствуйте:

Oracle DB: 10.2.0.1.0
OS: Oracle Interprise Linux


У меня похоже глюк,
имею запрос:

select *
from (
    select * 
    from messages_list 
    where user_id = 1
    and folder_id = 306
)
where rownum >= 0
and rownum <= 19

Запрос работает, выдает 19 а не 20 записей.

Но вот если меняю условие на:
where rownum >= 2
and rownum <= 39

То все, НОЛЬ записей!

Хотя во внутреннем запросе 300 записей
_spy_
Дата: 26.02.2007 19:12:35
Почитайте-ка про ROWNUM лучше.
В частности:

Oracle9i SQL Reference
Release 2 (9.2)
Conditions testing for ROWNUM values greater than a positive integer are always false
JackVlg
Дата: 26.02.2007 19:16:36
О как!

А как-же взять записи с X -> Y?
orawish
Дата: 26.02.2007 19:17:28
JackVlg
Здравствуйте:

Oracle DB: 10.2.0.1.0
OS: Oracle Interprise Linux


У меня похоже глюк,
имею запрос:

select *
from (
    select * 
    from messages_list 
    where user_id = 1
    and folder_id = 306
)
where rownum >= 0
and rownum <= 19

Запрос работает, выдает 19 а не 20 записей.

Но вот если меняю условие на:
where rownum >= 2
and rownum <= 39

То все, НОЛЬ записей!

Хотя во внутреннем запросе 300 записей

Нет, не глюк.
(Считайте, что ;) Псевдостолбец rownum заполняется в момент извлечения
данных. Первым кандидат-на-извлечение строка с rownum=1 - А? что? rownum >= 2 этож false,
т.е. уже первая строка (до её доставки вопрошающему) вернула конец данных. Занавес
JackVlg
Дата: 26.02.2007 19:17:51
rownum between 2 and 39

Тоже дает НОЛЬ записей
alex-ls
Дата: 26.02.2007 19:21:31
используйте алиасы для колонок :)
_spy_
Дата: 26.02.2007 19:22:41
автор
О как!

А как-же взять записи с X -> Y?


select <перечисление полей>
from (
    select <перечисление полей>, rownum rn 
    from messages_list
    where user_id = 1
    and folder_id = 306
)
where rn >= 0
and rn <= 19
JackVlg
Дата: 26.02.2007 19:29:06
Спасибо большое, помогло
Volder
Дата: 26.02.2007 20:48:33
orawish

Нет, не глюк.
(Считайте, что ;) Псевдостолбец rownum заполняется в момент извлечения
данных. Первым кандидат-на-извлечение строка с rownum=1 - А? что? rownum >= 2 этож false,
т.е. уже первая строка (до её доставки вопрошающему) вернула конец данных. Занавес

по-моему не совсем так...
после первой строки занавес рано приводить в движение.
смотрим вторую строку..
ей пытаемся снова присвоить rownum = 1,
т.е. условие rownum >=2 эта строка опять не пройдет.
так бежим по всем записям, но так как каждая из них в свою очередь не удовлетворит условиям,
в итоге будет все равно
orawish

Занавес
prokop
Дата: 27.02.2007 09:04:48
Лучше все таки так:
select <перечисление полей>
from (
    select <перечисление полей>, rownum rn 
    from messages_list
    where user_id = 1
    and folder_id = 306
    [b]and rownum <= :Y[/b]
)
where [b]rn >= :X[/b]