我正在使用oracle(10)。
我有两张表如下:
Table1 (uniq rows):
ID AMOUNT DATE
Table2:
ID AMOUNT1 AMOUNT2 ...AMOUNTN DATE
Table2通过ID连接到Table1多对一。
我需要的是更新Table1.DATE:表2中的最后一个(最早)日期,其中Table1.AMOUNT - SUM(Table2.AMOUNT1)< = 0,当Table2.DATE字段向后读表2时
有一种简单的方法吗?
提前致谢!
更新:正如我从您的回答中看到的那样,我错误地指出了一些问题。所以这里有一个详细的例子:
表1有:
ID: 1 AMOUNT:100 DATE:NULL
Table2有(对于ID:1,因此ID未在此处列出):
AMOUNT1 DATE
50 20080131
30 20080121
25 20080111
20 20080101
所以在这种情况下,我需要20080111
作为表1中的DATE,因为50 + 30 + 25 => 100。
答案 0 :(得分:4)
根据您修改过的问题,这是使用分析函数的一种情况。
假设您的意思是> = 100而不是< = 100,正如您的示例所示,并将DATE列重命名为THEDATE,因为DATE是Oracle中的保留字:
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
答案 1 :(得分:0)
首先关闭 - 你的数据库布局感觉严重错误,但我想你不能/不想改变它。 Table1
可能应该是一种观点,Table2
不会给人一种正确规范化的印象。像(ID, AMOUNT_TYPE, AMOUNT_VALUE, DATE)
这样的东西对我来说会更有意义。
但要解决你的问题(这是T-SQL“UPDATE FROM
”语法,但我认为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