我正在尝试从另一个表中的子查询中选择最新的价格。但是我无法弄清楚如何使其正常工作。
这是我尝试过的:
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
article_table
行返回一行。 - Vincent Malgratarticle_table
中获取大量行,则执行速度非常快(在您的情况下,这可能是最佳方法,因为您仅返回5行)。对于大型数据集,在执行连接之前允许优化器从更大的访问路径集合中进行选择,这可能会导致更有效的计划(特别是哈希连接)。 - Vincent Malgratfirst_value()
而不是row_number() ... where = 1
? - Benoitfirst_value
会针对article_table
中的每一行返回 N 行结果(其中 N 是该part_no
的price_history
行数)。这 N 行结果中的每一行都将具有相同的old_price
,因此您需要以某种方式进行去重。您可以使用 DISTINCT 进行去重,但我认为 RANK 方法更易于阅读 - 我使用row_number
是因为我不知道price_history
中的(part_no, valid_from)
是否唯一。 - Vincent Malgrat