我正在使用甲骨文(10)。

我有两个表如下:

Table1 (uniq rows):
ID    AMOUNT     DATE 

Table2:
ID    AMOUNT1 AMOUNT2 ...AMOUNTN DATE

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

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

有简单的方法吗?

提前致谢!

更新: 正如我从你的回答中看到的,我有点错误地指定了这个问题。这是一个详细的例子:

表1有:

ID: 1     AMOUNT:100    DATE:NULL

表2有(对于ID:1 因此此处未列出 ID):

AMOUNT1     DATE
50          20080131
30          20080121
25          20080111
20          20080101

所以在这种情况下我需要 20080111 表 1 中的日期为 50+30+25 => 100。

有帮助吗?

解决方案

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

假设您的意思是 >=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

其他提示

第一关 - 你的数据库布局感到严重错误的,但我猜你不能/不想去改变它。 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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top