Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 где ронум равен а где не равен?  [new]
Сортирующий ронумом
Guest
select е
from
(select е from test
where е_group='adf')
where rownum=2;

Итак у меня таблице тест есть 2 записи с e_group=adf

Мне надо получить 2-ю запись в группе адф.

если rownum<=2 я получаю 2 записи.
если rownum<=1 я получаю 1 запись.

если rownum=1 я получаю 1 запись.
если rownum=2 я получаю 0 записей.

В чём фокус?
25 янв 09, 16:17    [6732867]     Ответить | Цитировать Сообщить модератору
 Re: где ронум равен а где не равен?  [new]
I00N
Member

Откуда:
Сообщений: 454
Rownum присваивается записи ПОСЛЕ того, как запишь подошла по всем условиям в where.
В Вашем примере: запись успешно проходит фильтрацию(where), и оракл готов присвоить ей номер 1. Но: видя условие rownum = 2 оракл понимает, что запись не подходит и отбрасывает ее. Со следующей записью история повторяется.
25 янв 09, 16:48    [6732917]     Ответить | Цитировать Сообщить модератору
 Re: где ронум равен а где не равен?  [new]
I00N
Member

Откуда:
Сообщений: 454
Добавлю: чтобы запись прошла по условию rownum=N, обязана быть запись, у которой rownum=N-1. А откуда возьмется такая запись?

select е
from
(select е, rownum as rn from test
where е_group='adf' 
where rownum <=2)
where rn=2;
25 янв 09, 16:53    [6732924]     Ответить | Цитировать Сообщить модератору
 Re: где ронум равен а где не равен?  [new]
I00N
Member

Откуда:
Сообщений: 454
I00N

select е
from
(select е, rownum as rn from test
where е_group='adf' 
where rownum <=2)
where rn=2;

Случайно лишний where написал

select е
from
(select е, rownum as rn from test
where е_group='adf' 
and rownum <=2)
where rn=2;
25 янв 09, 16:54    [6732926]     Ответить | Цитировать Сообщить модератору
 Re: где ронум равен а где не равен?  [new]
Сортирующий ронумом с умом
Guest
понял пасиба!
25 янв 09, 16:54    [6732927]     Ответить | Цитировать Сообщить модератору
 Re: где ронум равен а где не равен?  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10045
Сортирующий ронумом,

Well ROWNUM is assigned to rows in result set. So SQL tries to find first matching row. At this point, SQL gives row it is testing benefit of a doubt and assumes it will fit and theats it as ROWNUM=1 and applies where clause which in your case is ROWNUM=2. So it obvioulsy fails. Now SQL finds next row to test. And since result set is still empty, again SQL assumes it will be first row (ROWNUM=1) in result set. So where clause fails again. And so on and so forth. Anyway, your query will work if you:

select е 
from 
(select е,rownum rn from test
where е_group='adf')
where rn=2;

But it does not make much sense, since it does not guarantee you will get same row every time you run it. Why? It depends on execution plan, for example. Anyway, without ORDER BY there is no guarantee you will get same row.

SY.
25 янв 09, 16:58    [6732933]     Ответить | Цитировать Сообщить модератору
 Re: где ронум равен а где не равен?  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10045
I00N
Rownum присваивается записи ПОСЛЕ того, как запишь подошла по всем условиям в where.


Not exacly, as I already said in my reply to Сортирующий ронумом SQL gives row it is testing benefit of a doubt and assumes it will fit and theats it as next ROWNUM. Otherwise, ROWNUM=1 would always fail.

SY.
25 янв 09, 17:01    [6732937]     Ответить | Цитировать Сообщить модератору
 Re: где ронум равен а где не равен?  [new]
Сортирующий ронумом с умом
Guest
SY
I00N
Rownum присваивается записи ПОСЛЕ того, как запишь подошла по всем условиям в where.


Not exacly, as I already said in my reply to Сортирующий ронумом SQL gives row it is testing benefit of a doubt and assumes it will fit and theats it as next ROWNUM. Otherwise, ROWNUM=1 would always fail.

SY.

why am i geting 1 record when i use rownum=1?
25 янв 09, 17:30    [6732973]     Ответить | Цитировать Сообщить модератору
 Re: где ронум равен а где не равен?  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10045
Сортирующий ронумом с умом
why am i geting 1 record when i use rownum=1?


Brush on your english. My reply to I00N in russian:

I00N
Rownum присваивается записи ПОСЛЕ того, как запишь подошла по всем условиям в where.


Не совсем. Как я уже сказал в своем ответе "Сортирующий ронумом" SQL предполагает тестируемая строка будет соответствовать условиям WHERE и "пре-присваивает" строке следующий ROWNUM. В противном случае, ROWNUM = 1 не вернет ничего.

SY.

Сообщение было отредактировано: 25 янв 09, 17:58
25 янв 09, 17:57    [6733005]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить