Question

J'utilise oracle (10).

J'ai deux tables comme suit:

Table1 (uniq rows):
ID    AMOUNT     DATE 

Table2:
ID    AMOUNT1 AMOUNT2 ...AMOUNTN DATE

Table2 est connecté plusieurs à un à Table1 connecté via un ID.

Ce dont j'ai besoin, c'est de mettre à jour Table1.DATE avec: la dernière date (la plus ancienne) de la Table2 où Table1.AMOUNT - SUM (Table2.AMOUNT1) < = 0, lors de la lecture de la Table 2 par la Table2 Champ .DATE.

Existe-t-il un moyen simple de le faire?

Merci d'avance!

MISE À JOUR: comme je vois dans vos réponses, j'ai mal spécifié la question. Alors voici un exemple détaillé:

Le tableau 1 contient:

ID: 1     AMOUNT:100    DATE:NULL

La table 2 a (pour l'ID: 1, donc l'ID n'est pas répertorié ici):

AMOUNT1     DATE
50          20080131
30          20080121
25          20080111
20          20080101

Donc, dans ce cas, j'ai besoin de 20080111 comme DATE dans le Tableau 1 sous la forme 50 + 30 + 25 = > 100.

Était-ce utile?

La solution

Sur la base de votre question révisée, c’est un cas d’utilisation des fonctions analytiques.

En supposant que vous vouliez dire > = 100 plutôt que < = 100 comme le suggère votre exemple, et renommer les colonnes DATE en THEDATE puisque DATE est un mot réservé dans 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 correspond à la valeur actuelle de table1, remplacez cette ligne par:

  where v.cumsum >= table1.amount

Autres conseils

Tout d’abord - la structure de votre base de données est gravement fausse, mais j’imagine que vous ne pouvez pas / ne voulez pas le changer. Table1 devrait probablement être une vue, et Table2 ne donne pas l'impression d'une normalisation appropriée. Quelque chose comme (ID, AMOUNT_TYPE, AMOUNT_VALUE, DATE) aurait beaucoup plus de sens pour moi.

Mais pour résoudre votre problème (c'est la syntaxe T-SQL " UPDATE FROM &, mais Oracle, je le sais bien):

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top