Обновить значение таблицы, сравнивая с другой таблицей - PullRequest
0 голосов
/ 11 марта 2020

Нужна помощь с моим oracle sql кодом. Это выглядит проще, но почему-то я просто не могу понять это правильно. У меня есть две таблицы A и B. В таблице A есть процедура, которая ежедневно вставляет данные из таблицы B. Но проблема в том, что данные таблицы B могут быть изменены пользователем, и после их изменения они не отражаются в моей таблице A (выделены желтым цветом). Я просто хочу обновить только выделенное значение. Пользователь может изменять любые данные из всех столбцов, поэтому я включаю все столбцы в свои коды

update tableA a set (a.date,a.id,a.sales,a.profit,a.loss) = (select b.date,b.id,b.sales,b.profit,b.loss from tableB b where a.date=b.date and a.id=b.id and a.sales=b.sales and a.profit=b.profit and a.loss=b.loss) where a.date = (select b.date from tableB b) and a.id != (select b.id from tableB b) and a.sales !=(select b.sales from tableB b) and a.profit != (select b.profit from tableB b) and a.loss != (select b.loss from tableB b)

enter image description here

Ответы [ 2 ]

1 голос
/ 11 марта 2020

Используя оператор UPDATE, вы можете достичь желаемого результата, используя следующие значения: SQL:

UPDATE TABLEA A
SET
    ( A."DATE", A.ID, A.SALES, A.PROFIT, A.LOSS ) = (
        SELECT
            B."DATE", B.ID, B.SALES, B.PROFIT, B.LOSS
        FROM TABLEB B
        WHERE A."DATE" = B."DATE"
    )
WHERE
    EXISTS (
        SELECT 1
          FROM TABLEB B
         WHERE A."DATE" = B."DATE"
          AND ( A.ID != B.ID 
                OR A.SALES != B.SALES
                OR A.PROFIT != B.PROFIT
                OR A.LOSS != B.LOSS )
    );

Совет : избегайте указания oracle зарезервированных ключевых слов (в вашем case DATE) в качестве имени столбца таблицы.

Cheers !!

0 голосов
/ 11 марта 2020

Поможет ли merge? Он способен вставлять новые строки и обновлять существующие. Например:

merge into tablea a
  using (select b.date, b.id, b.sales, b.profit, b.loss
         from tableb b
        ) x
  on (a.date = x.date)
when matched then update set
  a.id = x.id,
  a.sales = x.sales,
  a.profit = x.profit,
  a.loss = x.loss
  where a.id <> x.id
     or a.sales <> x.sales
     or a.profit <> x.profit
     or a.loss <> x.loss
when not matched then insert (date, id, sales, profit, loss)
  values (x.date, x.id, x.sales, x.profit, x.loss)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...