【发布时间】:2016-12-05 13:09:20
【问题描述】:
我有一张记录产品成本的表格。我想获得每种产品的平均成本和最后一次购买发票。
我的解决方案是创建一个子选择以获取最后一次购买发票,但不幸的是我得到了
ORA-00904: "B"."CODPROD": invalid identifier
我的查询是
SELECT (b.cod_aux) product,
-- here goes code to get average cost,
(SELECT round(valorultent, 2)
FROM (SELECT valorultent
FROM pchistest
WHERE codprod = b.codprod
ORDER BY dtultent DESC)
WHERE ROWNUM = 1)
FROM pchistest a, pcembalagem b
WHERE a.codprod = b.codprod
GROUP BY a.codprod, b.cod_aux
ORDER BY b.cod_aux
简而言之,我在 sub-select 上所做的是按顺序排序并在给定产品 b.codprod 的情况下获得第一行
【问题讨论】:
-
编辑您的问题并提供示例数据和所需的结果。目前尚不清楚您想做什么。例如,哪些列代表“价格”,“最后购买发票”是什么意思?哪一列标识了产品?
-
在 12c 版本之前的版本中,相关子查询只能引用上一级父查询的列。
codprod = b.codprod跨越两个级别,因此错误。 -
ROWNUM 在子查询中不能以这种方式工作。它适用于整个查询。您需要在外部查询中使用 ROW_NUMBER() OVER (PARTITION BY c.valorultent ORDER BY c.dtultent DESC) AS row_no 和 WHERE row_no = 1。
-
为什么不能使用最小/最大函数?取决于
dtultent可以有什么值.. -
@Doug
rownum适用于查询块。如果在子查询中使用它,它适用于子查询而不是“整个查询”。但这不是 OP 出现该错误的原因。
标签: sql oracle oracle11g subquery