質問

oracle(10)を使用しています。

次の2つのテーブルがあります:

Table1 (uniq rows):
ID    AMOUNT     DATE 

Table2:
ID    AMOUNT1 AMOUNT2 ...AMOUNTN DATE

Table2は、IDを介して接続されたTable1に多対1で接続されています。

必要なのは、Table1.DATEを更新することです:Table2から最後の(最も早い)日付Table1.AMOUNT-SUM(Table2.AMOUNT1)<!> lt; = 0、Table2によってテーブル2を逆読みする場合.DATEフィールド。

それを行う簡単な方法はありますか?

事前に感謝します!

更新:あなたの答えからわかるように、質問を少し間違って指定していました。以下に詳細な例を示します:

Table1の機能:

ID: 1     AMOUNT:100    DATE:NULL

Table2には(IDが1の場合、IDはここにリストされていません):

AMOUNT1     DATE
50          20080131
30          20080121
25          20080111
20          20080101

この場合、Table1のDATEとして50 + 30 + 25 = <!> gt;として20080111が必要です。 100。

役に立ちましたか?

解決

修正された質問に基づいて、これは分析関数を使用する場合です。

例のように<!> lt; = 100ではなく<!> gt; = 100を意味し、DATEはOracleの予約語であるため、列の名前をDATEからTHEDATEに変更するとします。

update table1 set thedate=
( select max(thedate) from
  ( select id, thedate,
           sum(amount1) over (partition by id  order by thedate desc) cumsum
    from table2
  ) v
  where v.cumsum >= 100
  and v.id = table1.id
)

100がtable1の現在の値を意味する場合、その行を次のように変更します。

  where v.cumsum >= table1.amount

他のヒント

まずは、データベースのレイアウトがひどく間違っていると感じますが、変更することはできない/したくないと思います。 Table1はおそらくビューである必要があり、Table2は適切な正規化の印象を与えません。 (ID, AMOUNT_TYPE, AMOUNT_VALUE, DATE)のようなものは、私にとってはるかに理にかなっています。

しかし、あなたの問題を解決するために(これはT-SQL <!> quot; UPDATE FROM <!> quot;構文ですが、Oracleはそれを知っていると思います):

UPDATE 
  Table1
SET
  Date = Table2Aggregate.MinDate
FROM
  Table1 
  INNER JOIN (
    SELECT Id, SUM(Amount1) SumAmount1, MIN(Date) MinDate 
    FROM Table2 
    GROUP BY Id
  ) AS Table2Aggregate ON Table1.Id = Table2Aggregate.ID 
WHERE
  Table1.Amount - Table2Aggregate.SumAmount1 <= 0
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top