обновить поле на основе промежуточного итога из другой таблицы

StackOverflow https://stackoverflow.com/questions/438547

Вопрос

Я использую оракул (10).

У меня есть две таблицы следующим образом:

Table1 (uniq rows):
ID    AMOUNT     DATE 

Table2:
ID    AMOUNT1 AMOUNT2 ...AMOUNTN DATE

Table2 подключается много к одному к Table1, подключенному через ID.

Мне нужно обновить Table1.DATE: последняя (самая ранняя) дата из Table2, где Table1.AMOUNT - SUM (Table2.AMOUNT1) < = 0 при чтении таблицы 2 в обратном порядке с помощью Table2 Поле .DATE.

Есть ли простой способ сделать это?

Заранее спасибо!

ОБНОВЛЕНИЕ . Как я вижу из ваших ответов, я немного ошибочно определил вопрос. Итак, вот подробный пример:

Таблица1 имеет:

ID: 1     AMOUNT:100    DATE:NULL

Таблица2 имеет (для ID: 1, поэтому ID здесь не указан):

AMOUNT1     DATE
50          20080131
30          20080121
25          20080111
20          20080101

Так что в этом случае мне нужно 20080111 в качестве ДАТЫ в Таблице 1 как 50 + 30 + 25 = > 100.

Это было полезно?

Решение

Исходя из вашего пересмотренного вопроса, это случай использования аналитических функций.

Предполагая, что вы имели в виду > = 100, а не < = 100, как предполагает ваш пример, и переименовывает столбцы DATE в THEDATE, поскольку DATE - зарезервированное слово в 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
)

Если 100 означает текущее значение table1, измените эту строку на:

  where v.cumsum >= table1.amount

Другие советы

Во-первых, ваш макет базы данных выглядит неправильно, но я думаю, вы не можете / не хотите его менять. Table1, вероятно, должно быть представлением, а Table2 не производит впечатление правильной нормализации. Что-то вроде (ID, AMOUNT_TYPE, AMOUNT_VALUE, DATE) имело бы для меня гораздо больше смысла.

Но чтобы решить вашу проблему (это T-SQL " UPDATE FROM " синтаксис, но я думаю, что Oracle это знает):

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top