Domanda

Sto usando Oracle (10).

Ho due tabelle come segue:

Table1 (uniq rows):
ID    AMOUNT     DATE 

Table2:
ID    AMOUNT1 AMOUNT2 ...AMOUNTN DATE

Table2 è collegato da molti a uno a Table1 connesso tramite ID.

Ciò di cui ho bisogno è l'aggiornamento di Table1.DATE con: l'ultima (prima) data da Table2 dove Table1.AMOUNT - SUM (Table2.AMOUNT1) < = 0, quando leggo la tabella 2 all'indietro dalla Table2 Campo .DATE.

C'è un modo semplice per farlo?

Grazie in anticipo!

AGGIORNAMENTO: come vedo dalle tue risposte, avevo specificato un po 'male la domanda. Quindi ecco un esempio dettagliato:

La tabella 1 ha:

ID: 1     AMOUNT:100    DATE:NULL

Tabella 2 ha (per ID: 1, quindi ID non è elencato qui):

AMOUNT1     DATE
50          20080131
30          20080121
25          20080111
20          20080101

Quindi in questo caso ho bisogno di 20080111 come DATA nella Tabella 1 come 50 + 30 + 25 = > 100.

È stato utile?

Soluzione

In base alla tua domanda rivista, questo è un caso per l'utilizzo di funzioni analitiche.

Supponendo che intendessi > = 100 anziché < = 100 come suggerisce l'esempio e rinominare le colonne DATE in THEDATE poiché DATE è una parola riservata in 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
)

Se 100 indica il valore corrente di table1, cambia quella riga in:

  where v.cumsum >= table1.amount

Altri suggerimenti

Prima di tutto, il layout del tuo database sembra gravemente sbagliato, ma immagino che non puoi / non vuoi cambiarlo. Table1 dovrebbe probabilmente essere una vista e Table2 non dà l'impressione di una normale normalizzazione. Qualcosa come (ID, AMOUNT_TYPE, AMOUNT_VALUE, DATE) avrebbe molto più senso per me.

Ma per risolvere il tuo problema (questa è T-SQL " UPDATE FROM " sintassi, ma penso che Oracle lo sappia):

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top