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

Откуда: Ukraine
Сообщений: 121
Есть вот такая вот табличка (уже немного "просеянная")
ID_   CLASS_ INDEX_      TOKEN_  
----- ------ ----------- ------- 
7     3      6           1
9     T      8           1
21    3      20          1
26    T      25          1
43    3      42          1
52    T      51          1
66    3      65          1
70    T      69          1
73    T      0           2
75    T      2           2
76    T      0           3
89    3      13          3
94    T      16          3
96    T      18          3
98    T      75          1
Один из индексов на таблице - (TOKEN_, INDEX_)

Из нее нужно было для каждой строки CLASS_='T' выбрать последнюю (с максимальным INDEX_) строку CLASS_='3' по тому же TOKEN_'у. Вот таким запросом я это сделал:

select
   log.ID_,
   log.CLASS_,
   log.INDEX_,
   log.TOKEN_,
   (select
      ID_
      from
         JBPM_LOG log_2
      where
         log_2.TOKEN_ = log.TOKEN_
         and
         log_2.INDEX_ =
            (select
               max(INDEX_)
               from
                  JBPM_LOG log_3
               where
                  log_3.TOKEN_ = log.TOKEN_
                  and
                  log_3.INDEX_ < log.INDEX_
                  and
                  log_3.CLASS_ = '3'
            )
   ) Last_3_ID
   from
      JBPM_LOG log
   where
      CLASS_ = 'T'

Получаем

ID_  CLASS_ INDEX_      TOKEN_  Last_3_ID      
---- ------ ----------- ------- -----------
9    T      8           1       7
26   T      25          1       21
52   T      51          1       43
70   T      69          1       66
73   T      0           2       NULL
75   T      2           2       NULL
76   T      0           3       NULL
94   T      16          3       89
96   T      18          3       89
98   T      75          1       66

Но заказчик захотел использовать joinы вместо подзапросов. Причем, говорит что в Оракле эту задачу можно решить без использования группировок и всяких max, min, с использованием неких специфичных для Оракла хинтов.
Есть идеи как это можно сделать?
9 апр 08, 15:51    [5525359]     Ответить | Цитировать Сообщить модератору
 Re: join вместо подзапросов  [new]
Elic
Member

Откуда:
Сообщений: 29979
Antei
Причем, говорит что в Оракле эту задачу можно решить без использования группировок и всяких max, min, с использованием неких специфичных для Оракла хинтов.
Любят некоторые неадекватные "заказчики" пилить сук, на котором сидят, или раскладывать в высокой траве грабли.
9 апр 08, 16:01    [5525446]     Ответить | Цитировать Сообщить модератору
 Re: join вместо подзапросов  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Antei
Но заказчик захотел использовать joinы вместо подзапросов. Причем, говорит что в Оракле эту задачу можно решить без использования группировок и всяких max, min, с использованием неких специфичных для Оракла хинтов.
Есть идеи как это можно сделать?
Хинтами не надо :)

А вообще - это обычная тут задачка:
либо row_number/dense_rank() over (order by ... desc) = 1, либо max () keep (dense_rank first/last ...)
9 апр 08, 16:03    [5525471]     Ответить | Цитировать Сообщить модератору
 Re: join вместо подзапросов  [new]
Antei
Member

Откуда: Ukraine
Сообщений: 121
Jannny
Хинтами не надо :)

А вообще - это обычная тут задачка:
либо row_number/dense_rank() over (order by ... desc) = 1, либо max () keep (dense_rank first/last ...)

Можно чуть подробнее про row_number/dense_rank() over (order by ... desc) = 1 ?

Что такое row_number понимаю, остальное пока нет...
(я в Оракле новичек)
9 апр 08, 16:07    [5525503]     Ответить | Цитировать Сообщить модератору
 Re: join вместо подзапросов  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Antei
Можно чуть подробнее про row_number/dense_rank() over (order by ... desc) = 1 ?

Что такое row_number понимаю, остальное пока нет...
Ну так в поиске посмотрите - это типа ключевые слова, например, эта ветка
9 апр 08, 16:12    [5525556]     Ответить | Цитировать Сообщить модератору
 Re: join вместо подзапросов  [new]
==Tims==
Member [заблокирован]

Откуда: Гена Евтушенко
Сообщений: 343
Elic
Antei
Причем, говорит что в Оракле эту задачу можно решить без использования группировок и всяких max, min, с использованием неких специфичных для Оракла хинтов.
Любят некоторые неадекватные "заказчики" пилить сук, на котором сидят, или раскладывать в высокой траве грабли.

ярый противник хинтов?
9 апр 08, 17:01    [5525980]     Ответить | Цитировать Сообщить модератору
 Re: join вместо подзапросов  [new]
Elic
Member

Откуда:
Сообщений: 29979
==Tims==
ярый противник хинтов?
STFF Выборка уникальных значений из хронологической таблицы

P.S. Если мозги есть, то воздух сотрясать больше не будешь
9 апр 08, 17:13    [5526086]     Ответить | Цитировать Сообщить модератору
 Re: join вместо подзапросов  [new]
==Tims==
Member [заблокирован]

Откуда: Гена Евтушенко
Сообщений: 343
Elic
==Tims==
ярый противник хинтов?
STFF Выборка уникальных значений из хронологической таблицы

P.S. Если мозги есть, то воздух сотрясать больше не будешь

ну конечно, у вас у теоретиков все таблицы содержат не более тысячи строк и создаются путем ...connect by level <=1000 или rownum <=1000 сразу перед "показухой")
9 апр 08, 17:31    [5526226]     Ответить | Цитировать Сообщить модератору
 Re: join вместо подзапросов  [new]
Antei
Member

Откуда: Ukraine
Сообщений: 121
Jannny
Antei
Можно чуть подробнее про row_number/dense_rank() over (order by ... desc) = 1 ?

Что такое row_number понимаю, остальное пока нет...
Ну так в поиске посмотрите - это типа ключевые слова, например, эта ветка


Я пошел похожим путем, только с first_value и last_value. Насколько я понимаю, выражения:
first_value(log_3.INDEX_) over (partition by log.ID_ order by log_3.ID_ desc)
и
last_value(log_3.INDEX_) over (partition by log.ID_ order by log_3.ID_ asc)
должны быть эквивалентны (чисто синтаксически, не вдаваясь в подробности)?
9 апр 08, 18:46    [5526691]     Ответить | Цитировать Сообщить модератору
 Re: join вместо подзапросов  [new]
Elic
Member

Откуда:
Сообщений: 29979
==Tims==
ну конечно, у вас у теоретиков
Ты как "великий" "практик" уже снискал (от слова пол, то бишь низ) "достойную" "славу". Сочувствую твоим недалёким работадателям.
9 апр 08, 20:13    [5526973]     Ответить | Цитировать Сообщить модератору
 Re: join вместо подзапросов  [new]
Elic
Member

Откуда:
Сообщений: 29979
Antei
first_value(log_3.INDEX_) over (partition by log.ID_ order by log_3.ID_ desc)
last_value(log_3.INDEX_) over (partition by log.ID_ order by log_3.ID_ asc)
должны быть эквивалентны?
Только в одной строчке группы Второе выражение вообще не имеет смысла, кроме как криптокодирования
RTFM windowing_clause (FAQ)
STFF Непонятки с аналитической функцией LAST_VALUE, analitic LAST_VALUE, Чем отличается min over от first_value?
9 апр 08, 20:50    [5527076]     Ответить | Цитировать Сообщить модератору
 Re: join вместо подзапросов  [new]
Antei
Member

Откуда: Ukraine
Сообщений: 121
Elic
Antei
first_value(log_3.INDEX_) over (partition by log.ID_ order by log_3.ID_ desc)
last_value(log_3.INDEX_) over (partition by log.ID_ order by log_3.ID_ asc)
должны быть эквивалентны?
Только в одной строчке группы Второе выражение вообще не имеет смысла, кроме как криптокодирования
RTFM windowing_clause (FAQ)
STFF Непонятки с аналитической функцией LAST_VALUE, analitic LAST_VALUE, Чем отличается min over от first_value?


Заюзал first_value, с last_value еще буду разбираться. Сенкс за линки.
9 апр 08, 21:26    [5527194]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить