0

私はオラクル(10)を使用しています。

次のように2つのテーブルがあります。

Table1 (uniq rows):
ID    AMOUNT     DATE 

Table2:
ID    AMOUNT1 AMOUNT2 ...AMOUNTN DATE

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

私が必要とするのは、Table1.DATE を更新することです: Table2.DATE フィールドによってテーブル 2 を逆方向に読み取るときに、Table1.AMOUNT - SUM(Table2.AMOUNT1) <= 0 である Table2 の最後の (最も早い) 日付。

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

前もって感謝します!

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

表 1 には次のものがあります。

ID: 1     AMOUNT:100    DATE:NULL

Table2 には (ID: 1 の場合、ID はここには記載されていません):

AMOUNT1     DATE
50          20080131
30          20080121
25          20080111
20          20080101

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

4

2 に答える 2

4

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

例が示すように <= 100 ではなく >=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
于 2009-01-13T10:49:25.220 に答える
0

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

しかし、あなたの問題を解決するには (これは T-SQL " UPDATE FROM" 構文ですが、オラクルはそれを知っていると思います):

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
于 2009-01-13T10:52:22.420 に答える