2009-01-13 64 views
0

我正在使用oracle(10)。根据另一个表的小计更新字段

我有两个表如下:

Table1 (uniq rows): 
ID AMOUNT  DATE 

Table2: 
ID AMOUNT1 AMOUNT2 ...AMOUNTN DATE 

表2连接多对一到Table通过ID连接。

我需要的是更新Table1.DATE:来自Table2的最后一个(最早的)日期,其中Table1.AMOUNT - SUM(Table2.AMOUNT1)< = 0,当向Table2DATE字段向后读取表2时。

有没有简单的方法来做到这一点?

在此先感谢!

更新:正如我从您的答案中看到的,我错误地指出了这个问题。所以这里去一个详细的例子:

表1有:

ID: 1  AMOUNT:100 DATE:NULL 

表2已(对ID:1,因此ID没有在这里列出):

AMOUNT1  DATE 
50   20080131 
30   20080121 
25   20080111 
20   20080101 

因此,在这种情况下,我需要20080111与Table1中的DATE一样为50 + 30 + 25 => 100.

+0

你为什么不提供创建表的脚本?这使得回答你的问题变得更容易。你为什么要打电话给专栏'日期'?您无法创建名为'date'的列名称的表格。 – tuinstoel 2009-01-13 12:51:00

+0

50 + 30 + 25> = 100 – tuinstoel 2009-01-13 13:06:47

+0

我同意tuinstoel,你的问题非常模糊地表达和难以遵循。起初你说<= 0,那么在你的例子中<= 100.你的意思是<= (or > =)table1.amount? – 2009-01-13 13:18:58

回答

4

根据您修改的问题,这是使用分析函数的情况。

假设你意> = 100,而不是< = 100作为示例所暗示的,并且重命名列日期THEDATE因为DATE是Oracle的保留字:如果100表示​​的电流值

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 
) 

表1然后更改该行:

where v.cumsum >= table1.amount 
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 
相关问题