0

我在 SQL 方面的背景有限,但我的谷歌搜索却不是,我觉得我可能只是缺少正确提出这个问题的词汇,所以希望除了回答我的问题之外,我还可以获得进一步研究这个问题所需的词汇。

我有一个零件表 - PARTS 我有一个采购订单表 - PO,我有一个 PO 行项目表 - PO_LINEITEM

我试图回答的问题是给定一个特定的部分,我想获得最新的采购订单,然后查看我们支付的价格。

PO 表保存填写采购订单的日期 (PO_DATE),PO_LINEITEM 表保存有关特定行项目的信息,例如部件主键 (PART_PRIMARYKEY) 和价格 (PART_PRICE)。PARTS 表并不像其他表那么重要,只是我需要返回一个 PART 主键,以便我可以将结果视图基于 PARTS 表

我已经通过子查询和可扩展的子查询等,但我似乎无法找到正确的组合。

我从以下基础开始:

SELECT a.PO_DATE, b.PART_PRIMARYKEY, b.PART_PRICE
FROM PO a, PO_LINEITEM b
WHERE a.PO_PRIMARYKEY = b.PO_PRIMARYKEY

正如您所期望的,这将返回 PO 中每个对象实例的列表,其中包含价格和采购订单的填写日期。我最接近解决这个问题的方法是在日期使用 MAX 函数,例如:

SELECT MAX(a.PO_DATE) AS DATE, b.PART_PRIMARYKEY, b.PART_PRICE
FROM PO a, PO_LINEITEM b
WHERE a.PO_PRIMARYKEY = b.PO_PRIMARYKEY
GROUP BY b.PART_PRIMARYKEY, b.PART_PRICE

这将返回我们为特定零件支付的每个价格的最大日期,因此:

PART 1234, £12.95, 12/08/2012
PART 1234, £13.00, 14/08/2012
PART 1234. £11.15, 17/08/2012
PART 2345, £5.25, 12/08/2012
PART 2345, £5.65, 2012 年 13 月 8 日

我需要的是:

第 1234 部分,11.15 英镑,2012 年8 月 17 日第 2345
部分。5.65 英镑,2012 年 8月 13 日

如果我可以按 PART_PRIMARYKEY 进行分组,那就太好了,但是当我尝试时,我得到一个 ORA-00979 而不是 GROUP BY 表达式。

就像我说的那样,我觉得我在这个问题上缺乏词汇量阻碍了我找到答案,所以如果有人能指出我正确的方向,我将不胜感激

所以希望我不是问一个每隔一天就会被问到的问题,但因为我没有使用神奇的单词组合来找到,所以没有找到。

感谢您提供的任何帮助。

4

1 回答 1

1

查找分析函数。它们是在 8i 中引入的,尽管我不确定它们在当时的先进程度与它们在 11 中的表现相比有多好。我用来理解它们的一些链接:

http://www.oracle-base.com/articles/misc/analytic-functions.php

http://www.orafaq.com/node/55

不过,这样的子查询可能就足够了(我可能会混淆您的列命名):

select A.PART_PRIMARYKEY, B.PART_PRICE, A.PO_DATE
  from PO A, PO_LINEITEM B
 where A.PO_PRIMARYKEY = B.PO_PRIMARYKEY
       and (A.PART_PRIMARYKEY, A.PO_DATE) in
             (  select A.PART_PRIMARYKEY, max(A.PO_DATE)
                  from PO A, PO_LINEITEM B
                 where A.PO_PRIMARYKEY = B.PO_PRIMARYKEY
              group by A.PART_PRIMARYKEY); 
于 2012-08-23T21:54:03.083 回答