2009-01-13 65 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 
相關問題