Pregunta

Estoy usando Oracle (10).

Tengo dos tablas de la siguiente manera:

Table1 (uniq rows):
ID    AMOUNT     DATE 

Table2:
ID    AMOUNT1 AMOUNT2 ...AMOUNTN DATE

Table2 está conectado muchos a uno a Table1 conectado a través de ID.

Lo que necesito es actualizar Table1.DATE con: la última (más temprana) fecha de Table2 donde Table1.AMOUNT - SUM (Table2.AMOUNT1) < = 0, al leer la tabla 2 al revés de Table2 .FECHA campo.

¿Hay una manera simple de hacerlo?

¡Gracias de antemano!

ACTUALIZACIÓN: como veo en sus respuestas, especifiqué un poco la pregunta. Así que aquí va un ejemplo detallado:

Tabla1 tiene:

ID: 1     AMOUNT:100    DATE:NULL

Table2 tiene (para ID: 1, por lo que la ID no figura aquí):

AMOUNT1     DATE
50          20080131
30          20080121
25          20080111
20          20080101

Entonces, en este caso, necesito 20080111 como FECHA en la Tabla1 como 50 + 30 + 25 = > 100.

¿Fue útil?

Solución

Basado en su pregunta revisada, este es un caso para usar funciones analíticas.

Suponiendo que quiso decir > = 100 en lugar de < = 100 como su ejemplo lo indica, y renombrando las columnas DATE a THEDATE ya que DATE es una palabra reservada en 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
)

Si 100 significa el valor actual de table1, cambie esa línea a:

  where v.cumsum >= table1.amount

Otros consejos

Primero, el diseño de su base de datos se siente muy mal, pero supongo que no puede / no quiere cambiarlo. Table1 probablemente debería ser una vista, y Table2 no da la impresión de una normalización adecuada. Algo así como (ID, AMOUNT_TYPE, AMOUNT_VALUE, DATE) tendría mucho más sentido para mí.

Pero para resolver su problema (esto es T-SQL " UPDATE FROM " sintaxis, pero creo que Oracle lo sabe):

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top