Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Странно работает rownum в подзапросе  [new]
Лелик аноним
Guest
Всем привет!

Сразу начну с кода, пожалуй.

create table test
(
    c1 int,
    c2 int
);

insert into test values (1, 1);
insert into test values (2, 1);
insert into test values (3, 1);
insert into test values (4, 2);
insert into test values (5, 2);

select
    t1.c2,
    (select t3.c2 from (select t2.c2, rownum rn from test t2 where t1.c2 = t2.c2 order by t2.c1) t3 where t3.rn = 1)
from
    test t1
group by
    t1.c2

Подскажите, пожалуйста, почему такой код возвращает 1 и 1 во втором столбце, вместо 1 и 4?
С Ораклом работаю впервые, может тут что-то элементарное, но непонятно.
24 июн 10, 12:00    [8993166]     Ответить | Цитировать Сообщить модератору
 Re: Странно работает rownum в подзапросе  [new]
Добрый Э - Эх
Guest
rownum присваивается до сортировки...
24 июн 10, 12:02    [8993194]     Ответить | Цитировать Сообщить модератору
 Re: Странно работает rownum в подзапросе  [new]
Добрый Э - Эх
Guest
А вообще RTF F.A.Q.
24 июн 10, 12:04    [8993210]     Ответить | Цитировать Сообщить модератору
 Re: Странно работает rownum в подзапросе  [new]
Эмм
Guest
А в какой версии Oracle доступно обращение к внешнему столбцу из двойной вложенности? В данном случае:
where t1.c2 = t2.c2
24 июн 10, 12:17    [8993411]     Ответить | Цитировать Сообщить модератору
 Re: Странно работает rownum в подзапросе  [new]
Elic
Member

Откуда:
Сообщений: 29990
Лелик аноним
    (select t3.c2 from (select t2.c2, rownum rn from test t2 where t1.c2 = t2.c2 order by t2.c1) t3 where t3.rn = 1)
Это компилябельно только в багообразной 10.2.0.1
Elic
STFF inline view не может быть коррелированным
24 июн 10, 12:18    [8993432]     Ответить | Цитировать Сообщить модератору
 Re: Странно работает rownum в подзапросе  [new]
RA\/EN
Member

Откуда:
Сообщений: 3659
Elic
Лелик аноним
    (select t3.c2 from (select t2.c2, rownum rn from test t2 where t1.c2 = t2.c2 order by t2.c1) t3 where t3.rn = 1)
Это компилябельно только в багообразной 10.2.0.1
Elic
STFF inline view не может быть коррелированным

STFF inline view может быть коррелированным
24 июн 10, 12:22    [8993504]     Ответить | Цитировать Сообщить модератору
 Re: Странно работает rownum в подзапросе  [new]
Лелик аноним
Guest
Elic
Лелик аноним
    (select t3.c2 from (select t2.c2, rownum rn from test t2 where t1.c2 = t2.c2 order by t2.c1) t3 where t3.rn = 1)
Это компилябельно только в багообразной 10.2.0.1
Elic
STFF inline view не может быть коррелированным

Жесть. У меня тоже было подозрение что внутренняя выборка не фильтруется. Эх, как тяжело с MS SQL переходить :(

Может мою задачу можно решить по-другому, помогите, плиз.
В общем есть некий запрос, который делает выборку из таблицы А. Для каждой строчки таблицы А, нужно выполнить подзапросик к таблице Б по условию А.поле1 = Б.поле1, при этом взять первую соответствующую запись из таблицы Б (их много может оказаться для А.поле1, нужно последнюю по Б.некая_дата).
На MS SQL это было бы так:

select
    (select top 1 Б.поле2 from Б where А.поле1 = Б.поле1 order by Б.некая_дата desc)
from A
24 июн 10, 12:26    [8993565]     Ответить | Цитировать Сообщить модератору
 Re: Странно работает rownum в подзапросе  [new]
Добрый Э - Эх
Guest
Лелик аноним
Может мою задачу можно решить по-другому, помогите, плиз.

Тынц
24 июн 10, 12:30    [8993622]     Ответить | Цитировать Сообщить модератору
 Re: Странно работает rownum в подзапросе  [new]
Elic
Member

Откуда:
Сообщений: 29990
RA\/EN
STFF inline view может быть коррелированным
Там нет скоррелированного inline view.
Т.е. название ссылки не соответствует содержанию :) Т.е. слегка мимо
24 июн 10, 12:50    [8993910]     Ответить | Цитировать Сообщить модератору
 Re: Странно работает rownum в подзапросе  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
Лелик аноним
Может мою задачу можно решить по-другому, помогите, плиз.

Изврат но всеже:
with A as (select 1 field1 from dual
      union all
           select 2 from dual   
      union all
           select 3 from dual   
     ),
     B as (select 1 field1,2 field2, sysdate somedate from dual
           union all 
           select 1 field1,3 field2, to_date('1.1.1920','dd.mm.yyyy') from dual
           union all 
           select 2 field1,4 field2, to_date('1.1.1900','dd.mm.yyyy') from dual
     )
select E.field2     
from A, ( 
  select D.field1,D.field2,row_number() over(partition by D.field1 order by D.somedate desc) rn from B D
 ) E
 where E.rn(+)=1
   and A.field1=E.field1(+);
24 июн 10, 13:01    [8994029]     Ответить | Цитировать Сообщить модератору
 Re: Странно работает rownum в подзапросе  [new]
Elic
Member

Откуда:
Сообщений: 29990
Лелик аноним
    (select t3.c3 from (select t2.c3, rownum rn from test t2 where t1.c2 = t2.c2 order by t2.c1) t3 where t3.rn = 1)
Для каждой строчки таблицы А, нужно выполнить подзапросик к таблице Б по условию А.поле1 = Б.поле1, при этом взять первую соответствующую запись из таблицы Б (их много может оказаться для А.поле1, нужно последнюю по Б.некая_дата).
(select max(t2.c3) keep (dense_rank first order by t2.c1) from test t2 where t2.c2 = t1.c2)
RTFM FIRST/LAST
24 июн 10, 13:06    [8994101]     Ответить | Цитировать Сообщить модератору
 Re: Странно работает rownum в подзапросе  [new]
Лелик аноним
Guest
Elic
Лелик аноним
    (select t3.c3 from (select t2.c3, rownum rn from test t2 where t1.c2 = t2.c2 order by t2.c1) t3 where t3.rn = 1)
Для каждой строчки таблицы А, нужно выполнить подзапросик к таблице Б по условию А.поле1 = Б.поле1, при этом взять первую соответствующую запись из таблицы Б (их много может оказаться для А.поле1, нужно последнюю по Б.некая_дата).
(select max(t2.c3) keep (dense_rank first order by t2.c1) from test t2 where t2.c2 = t1.c2)
RTFM FIRST/LAST


Работает, спасибо!
Только это следствие бага или все же так можно писать с вложенным запросом?
24 июн 10, 13:10    [8994152]     Ответить | Цитировать Сообщить модератору
 Re: Странно работает rownum в подзапросе  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
Лелик аноним
Только это следствие бага или все же так можно писать с вложенным запросом?


С 1 можно с большей вложенностью нет :)
24 июн 10, 13:14    [8994194]     Ответить | Цитировать Сообщить модератору
 Re: Странно работает rownum в подзапросе  [new]
RA\/EN
Member

Откуда:
Сообщений: 3659
Elic
RA\/EN
STFF inline view может быть коррелированным
Там нет скоррелированного inline view.
Т.е. название ссылки не соответствует содержанию :) Т.е. слегка мимо

Зато работает как хочет автор, и ровно та проблема, что у автора, решается (не спорю, что через ж..у )
24 июн 10, 13:18    [8994240]     Ответить | Цитировать Сообщить модератору
 Re: Странно работает rownum в подзапросе  [new]
Лелик аноним
Guest
Сергей Арсеньев
Лелик аноним
Только это следствие бага или все же так можно писать с вложенным запросом?


С 1 можно с большей вложенностью нет :)

Все понял, в чем ошибка была, сеньк.

Изврат-не изврат, но запрос коротко выглядит :)
24 июн 10, 13:21    [8994268]     Ответить | Цитировать Сообщить модератору
 Re: Странно работает rownum в подзапросе  [new]
Elic
Member

Откуда:
Сообщений: 29990
RA\/EN
Зато
Я прошу лишь всуе не покушаться на святость моей (с) формулировки :)
24 июн 10, 13:32    [8994378]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить