根据另一个表的小计更新字段

Posted

技术标签:

【中文标题】根据另一个表的小计更新字段【英文标题】:update a field based on subtotal from another table 【发布时间】:2009-01-13 10:32:33 【问题描述】:

我正在使用 oracle(10)。

我有两张表如下:

Table1 (uniq rows):
ID    AMOUNT     DATE 

Table2:
ID    AMOUNT1 AMOUNT2 ...AMOUNTN DATE

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

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

有简单的方法吗?

提前致谢!

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

Table1 有:

ID: 1     AMOUNT:100    DATE:NULL

Table2 有(对于 ID:1,因此 ID 未在此处列出):

AMOUNT1     DATE
50          20080131
30          20080121
25          20080111
20          20080101

所以在这种情况下,我需要 20080111 作为 Table1 中的 DATE 为 50+30+25 => 100。

【问题讨论】:

为什么不提供创建表脚本?这使回答您的问题变得更加容易。为什么你称列“日期”?您不能创建列名为“日期”的表。 我同意tuinstoel,你的问题表达得很含糊,难以理解。起初你说 =)table1.amount吗? 【参考方案1】:

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

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

如果 100 表示 table1 的当前值,则将该行更改为:

  where v.cumsum >= table1.amount

【讨论】:

感谢您的帮助 Tony,请注意我不是程序员,仅获得金融学位,并且从像您这样的人那里学到了很多东西,因为我必须与银行软件支持一起工作...您对我帮助很大——如果有人能用简单的话解释它是如何工作的;-)【参考方案2】:

首先 - 您的数据库布局感觉严重错误,但我猜您不能/不想更改它。 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

【讨论】:

我已经用一个更详细的例子编辑了这个问题,因为你的例子几乎是一个很好的解决方案,除了 Table2 中有很多 SUM(Amount1) 的情况 - 因为这找到了我看到的最后一个日期...

以上是关于根据另一个表的小计更新字段的主要内容,如果未能解决你的问题,请参考以下文章

SQL技巧两则:选择一个表的字段插入另一个表,根据其它表的字段更新本表内容

关于oracle中 根据一个表的主键数据同步更新另一个关联表的字段。

mysql 根据一个表的数据更新另一个表

mysql 根据一个表的数据更新另一个表

根据提交给另一个表格的表格更新表格中的字段

在SQL中统计一个字段 然后再更新到另一张表的一个字段