Frage

Ich bin mit Oracle (10).

Ich habe zwei Tabellen bekam wie folgt:

Table1 (uniq rows):
ID    AMOUNT     DATE 

Table2:
ID    AMOUNT1 AMOUNT2 ...AMOUNTN DATE

ist Table2 viele der mit einem zu Tabelle 1 über ID verbunden ist.

Was ich brauche, ist update-ing Table1.DATE mit: die letzten (frühesten) stammt aus Tabelle 2, wo Table1.AMOUNT - SUM (Table2.AMOUNT1) <= 0, wenn Tabellenstand 2 nach hinten durch das Feld Table2.DATE.

Gibt es eine einfache Möglichkeit, es zu tun?

Vielen Dank im Voraus!

UPDATE: , wie ich aus Ihren Antworten sehen hatte ich die Frage ein wenig falsch angegeben. So, hier geht ein ausführliches Beispiel:

Tabelle 1 hat:

ID: 1     AMOUNT:100    DATE:NULL

Table2 hat (für ID: 1 so ID ist nicht hier aufgelistet):

AMOUNT1     DATE
50          20080131
30          20080121
25          20080111
20          20080101

Also in diesem Fall muß ich 20080111 als DATE in Tabelle 1 als 50 + 30 + 25 => 100.

War es hilfreich?

Lösung

Auf der Basis Ihrer revised Frage, dies ist ein Fall für analytische Funktionen verwendet wird.

Angenommen, Sie gemeint> = 100 statt <= 100 als Beispiel impliziert und Umbenennen von Spalten hinzugefügt bis theDate seit DATE ein reserviertes Wort in Oracle ist:

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
)

Wenn die 100 den aktuellen Wert von table1 bedeutet dann diese Zeile ändern:

  where v.cumsum >= table1.amount

Andere Tipps

Als erstes - Ihr Datenbank-Layout stark falsch anfühlt, aber ich denke, man kann nicht / nicht, es zu ändern. Table1 soll wohl eine Ansicht sein, und Table2 macht nicht den Eindruck der richtigen Normalisierung. So etwas wie (ID, AMOUNT_TYPE, AMOUNT_VALUE, DATE) würde viel mehr Sinn für mich.

Aber Ihr Problem zu lösen (das ist T-SQL "UPDATE FROM" Syntax, aber ich glaube, Oracle weiß es):

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top