Pergunta

Estou usando o Oracle (10).

Eu tenho duas tabelas da seguinte forma:

Table1 (uniq rows):
ID    AMOUNT     DATE 

Table2:
ID    AMOUNT1 AMOUNT2 ...AMOUNTN DATE

Table2 está ligado muitos para um para Table1 conectado via ID.

O que eu preciso é-update ing Table1.DATE com: a última (primeira) data a partir da Table2 onde Table1.AMOUNT - SUM (Table2.AMOUNT1) <= 0, quando a leitura da tabela 2 para trás pelo campo Table2.DATE.

Existe uma maneira simples de fazê-lo?

Agradecemos antecipadamente!

UPDATE: como eu ver a partir de suas respostas que eu tinha mal especificado a questão um pouco. Então aqui vai um exemplo detalhado:

Tabela 1 tem:

ID: 1     AMOUNT:100    DATE:NULL

Tabela2 tem (para ID: 1 de modo ID não estiver listado aqui):

AMOUNT1     DATE
50          20080131
30          20080121
25          20080111
20          20080101

Portanto, neste caso eu preciso 20080111 como a data na Tabela 1 como 50 + 30 + 25 => 100.

Foi útil?

Solução

Com base na sua pergunta revista, este é um caso para o uso de funções analíticas.

Assumindo que você quis dizer> = 100 em vez de <= 100 como o seu exemplo implica, e renomeando colunas DATE para thedate desde DATE é uma palavra reservada no 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 os 100 significa que o valor atual de table1 altere essa linha para:

  where v.cumsum >= table1.amount

Outras dicas

Em primeiro lugar - o layout do banco de dados se sente seriamente errado, mas eu acho que você não pode / não quer mudá-lo. Table1 provavelmente deve ser uma visão, e Table2 não fazer a impressão de uma normalização adequada. Algo como (ID, AMOUNT_TYPE, AMOUNT_VALUE, DATE) faria muito mais sentido para mim.

Mas para resolver o seu problema (isto é T-SQL sintaxe "UPDATE FROM", mas acho que a Oracle sabe disso):

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top