一尘不染

在Oracle中进行子选择

sql

我正在尝试从子选择的另一个表中选择最新价格。但是我不知道如何使它工作。

这是我尝试过的:

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

阅读 164

收藏
2021-05-23

共1个答案

一尘不染

在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_priceprice_history时提供的article_table.part_no

2021-05-23