別のテーブルの小計に基づいてフィールドを更新する
-
22-07-2019 - |
質問
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