Подбирать в оракуле - PullRequest
       2

Подбирать в оракуле

5 голосов
/ 21 апреля 2011

Я пытаюсь выбрать самую новую цену из другой таблицы в дополнительном списке. Но я не могу понять, как заставить это работать.

Вот что я пробовал:

select something, somthingelse, 
  (
    select * from 
    (
      select QUOTE_PRICE as old_price
      from price_history
      where price_history.part_no= article_table.part_no
      order by valid_from desc
    ) where rownum=1
  )
from  article_table where rownum < 5

Подвыбор работает сам по себе, но не может найти article_table.part_no:

Ошибка SQL: ORA-00904: «article_table». «Part_no»: неверный идентификатор

Обновление:

Текущее решение:

select something, somethingelse, (
  SELECT MIN(QUOTE_PRICE) KEEP (DENSE_RANK FIRST ORDER BY valid_from)
  FROM price_history
  WHERE part_no=article_table.part_no
) as old_price
from  article_table a where rownum < 5

Ответы [ 3 ]

6 голосов
/ 21 апреля 2011

В Oracle подзапросы могут видеть значения из родительских запросов только на один уровень.Поскольку у вас есть два вложенных выбора, внутренний не может видеть значения из внешнего.

Вы можете выполнить соединение первым:

SELECT something, somthingelse, old_price
  FROM (SELECT a.something, a.somthingelse, p.quote_price old_price,
               row_number() over (PARTITION BY a.part_no 
                                  ORDER BY valid_from DESC) rnk
           FROM article_table a
           LEFT JOIN price_history p ON a.part_no = p.part_no)
 WHERE rnk = 1;

Вы также можете использовать функцию PL / SQL, которая будет возвращать первый quote_price из price_history при получении article_table.part_no.

2 голосов
/ 21 апреля 2011

Попробуйте использовать псевдоним article_table в самом внешнем запросе:

select a.something, a.somthingelse, 
  (
    select * from 
    (
      select QUOTE_PRICE as old_price
      from price_history
      where price_history.part_no= a.part_no
      order by valid_from desc
    ) where rownum=1
  )
from  article_table a where rownum < 5

Кроме того, вы можете захотеть изучить аналитические функции Oracle, чтобы сделать более простые запросы для такого рода целей:

http://psoug.org/reference/analytic_functions.html

1 голос
/ 21 апреля 2011

Я бы попробовал следующее:

select something, somethingelse, last_value(quote_price) over (partition by part_no order by valid_from asc)
  from article_table inner join price_history using (part_no)
 where rownum < 5;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...