0

私のSQLのバックグラウンドは限られていますが、私のグーグルはそうではありません。この質問を適切に行うための語彙が不足しているだけかもしれないので、質問への回答を超えて、この問題をさらに調査するために必要な語彙を取得できることを願っています。

私は部品テーブルを持っています - PARTS 私は発注書テーブルを持っています - PO と私は PO Line Item テーブルを持っています - PO_LINEITEM

私が答えようとしている質問は、特定の部品が与えられ、最新の注文書を入手して、支払った価格を調べたいというものです。

PO テーブルには、発注書が記入された日付 (PO_DATE) が保持され、PO_LINEITEM テーブルには、部品の主キー (PART_PRIMARYKEY) や価格 (PART_PRICE) などの特定の品目に関する情報が保持されます。PARTS テーブルは、結果のビューを PARTS テーブルに基づいて作成できるように PART 主キーを返す必要があることを除いて、他のテーブルほど重要ではありません。

サブクエリやスケーラブルなサブクエリなどを経験してきましたが、適切な組み合わせが見つからないようです。

私は以下のベースから始めました:

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/08/13
など

私が必要とするのは:

パート 1234、£11.15、17/08/2012
パート 2345。£ 5.65、13/08/2012

PART_PRIMARYKEY でグループ化できれば素晴らしいのですが、試してみると GROUP BY 式ではなく ORA-00979 が返されます。

私が言ったように、この問題に関する私の語彙不足が答えを見つけるのを妨げていると感じているので、誰かが私を正しい方向に向けることができれば感謝します.

うまくいけば、隔日で尋ねられる質問をしていないことを願っていますが、見つけるために単語の魔法の組み合わせを使用しなかったために見つけられませんでした.

ご協力いただきありがとうございます。

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 に答える