Перенести сумму из одной таблицы в другую на основе условия и того же первичного ключа - PullRequest
2 голосов
/ 21 февраля 2020

У меня есть оператор обновления, в котором я хотел бы перенести значение из одной таблицы в другую таблицу с тем же PK. По сути, я хочу ввести значение AWARD из таблицы AWARD и заполнить его в таблице TEST в столбце AWARD только там, где TYPE = 'CON'. Нужно сделать то же самое со столбцом Дата.

Таблица Award может иметь несколько строк, поэтому сумма должна быть суммирована. Я использую Oracle SQL Developer. Любая помощь приветствуется!

UPDATE TEST A 
SET A.AWARD = (SELECT SUM(B.AWARD) 
               FROM AWARD B 
               WHERE B.ID = A.ID  GROUP BY B.ID) 
WHERE TRIM(A.TYPE) = 'CON';

Текущий TEST данные таблицы:

 ID     TYPE            AMOUNT          AWARD       DATE
---------------------------------------------------------
7186    INSPECT     $942,164.81         
7186    CMP         $1,392,528.28       
7186    CON         $92,464,162.51      

Award таблица

 ID        AWARD            DATE        
-----------------------------------
7186    $83,157,895.00    6/25/2007

Ожидаемый результат:

 ID     TYPE            AMOUNT             AWARD            DATE
--------------------------------------------------------------------
7186    INSPECT      $942,164.81        
7186    CMP         $1,392,528.28       
7186    CON        $92,464,162.51      $83,157,895.00    6/25/2007

Ответы [ 3 ]

3 голосов
/ 21 февраля 2020

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

UPDATE TEST T
    SET (T.AWARD, T.DATE) = (SELECT SUM(A.AWARD), MAX(A.DATE)
                             FROM AWARD A
                             WHERE A.ID = T.ID
                            ) 
    WHERE TRIM(T.TYPE) = 'CON';

Обратите внимание, что GROUP BY в подзапросе не требуется.

Примечание. Я также изменил псевдонимы таблиц, чтобы они были сокращениями для имена таблиц, а не бессмысленные одиночные символы.

1 голос
/ 21 февраля 2020

Одним из вариантов будет использование прямого оператора UPDATE, содержащего предложение EXISTS

 UPDATE TEST T 
    SET (T.AWARD,T."DATE") = (
                              SELECT SUM(A.AWARD), MAX("DATE") 
                                FROM AWARD A 
                               WHERE A.ID = T.ID  
                              ) 
  WHERE EXISTS ( SELECT 1 FROM AWARD A WHERE A.ID = T.ID )
    AND TRIM(T.TYPE) = 'CON';
1 голос
/ 21 февраля 2020

Это хороший вариант использования для Oracle merge синтаксиса:

merge into test t
using (select id, sum(award) award, max(mydate) mydate from award group by id) a
on (a.id = t.id and t.type = 'CMP')
when matched then update set t.award = a.award, t.mydate = a.mydate

Примечания:

  • вы не сказали, какую дату вы хотите для выбора, когда более чем одна запись соответствует заданному id в таблице award, поэтому я использовал самую последнюю дату

  • date - зарезервированное слово в Oracle - Я переименовал его в mydate в запросе

Демонстрация на DB Fiddle :

  ID | TYPE    |      AMOUNT |    AWARD | MYDATE   
---: | :------ | ----------: | -------: | :--------
7186 | INSPECT |   942164.81 |     <em>null</em> | <em>null</em>     
7186 | CMP     |  1392528.28 | 83157895 | 25-JUN-07
7186 | CON     | 92464162.51 |     <em>null</em> | <em>null</em>     
...