0

我正在使用 oracle(10)。

我有两个表如下:

Table1 (uniq rows):
ID    AMOUNT     DATE 

Table2:
ID    AMOUNT1 AMOUNT2 ...AMOUNTN DATE

Table2 与通过 ID 连接的 Table1 多对一连接。

我需要的是更新 Table1.DATE:Table2 的最后(最早)日期,其中 Table1.AMOUNT - SUM(Table2.AMOUNT1) <= 0,当通过 Table2.DATE 字段向后读取表 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。

4

2 回答 2

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
于 2009-01-13T10:49:25.220 回答
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
于 2009-01-13T10:52:22.420 回答