1

我知道“如何限制”或“如何获得第一行”已经发布了很多次,但我找不到针对我的具体问题的解决方案。

我有一个库存余额表,其中包含带有数量的 bin #

我想在我的行上包含最大数量的 bin #

真正的查询比这更大更复杂,但这个例子显示了我面临的问题

我首先做了

select itemnumber,
(select binnumber from inventory_balance where current_balance = (select max(current_balance) from inventory_balance where inventory_balance.itemnumber = item_table.itemnumber)) as binnumber
from item_table;

当只有一个数量最多的“垃圾箱”时,这将起作用。

如果同一商品有 2 个 bin,数量为 10(这是最大数量),则子查询将返回 2 行,触发 oracle 错误

然后我尝试了这个:

select 
itemnumber,
(select binnumber from (select binnumber from inventory_balance where current_balance = (select max(current_balance) from inventory_balance where inventory_balance.itemnumber = item_table.itemnumber)) where rownum =1) as binnumber
from item_table;

现在这将不起作用,因为在 from (...) 内部似乎对 item_table.itemnumber 的引用无效。尝试这样做时出现“无效的列名”错误。

我不能使用 ROW_NUMBER() 因为数据库上似乎没有激活“OLAP 窗口函数”。

4

1 回答 1

1

像这样的东西:

SELECT t.itemnumber,
       MIN( b.binnumber ) KEEP ( DENSE_RANK LAST ORDER BY b.current_balance ASC ) AS binnumber
FROM   item_table t
       LEFT OUTER JOIN inventory_balance b
       ON ( t.itemnumber = b.itemnumber )
GROUP BY t.itemnumber;

查看解释计划,然后这将只扫描inventory_balance一次,而进行嵌套选择以获得MAX平衡,然后根据需要过滤两次外部查询inventory_balance

尽管您最小工作示例所需的所有输出似乎都包含在表中,但您可以这样做(如果您对表中没有条目inventory_balance的 s 不感兴趣):itemnumberinventory_balance

SELECT itemnumber,
       MIN( binnumber ) KEEP ( DENSE_RANK LAST ORDER BY current_balance ASC ) AS binnumber
FROM   inventory_balance
GROUP BY itemnumber;

如果您想要最高binnumber(而不是最低),那么您可以将其更改为:

MAX( binnumber ) KEEP ...
于 2013-12-21T01:12:29.530 回答