Как обновить данные только при изменении данных в Oracle? - PullRequest
0 голосов
/ 19 ноября 2018

Могу ли я узнать, как обновить данные только при изменении данных в oracle?

Например, таблица tb_user

userid, name, email
1234, Peter, peter1234@e.com

Я хотел бы обновить данные только тогда, когда один изполе изменилось.

Я попытался объединить в метод.Но он будет либо обновляться, либо вставляться без какой-либо проверки.

Теперь я создал таблицу tmp tb_tmp_user, чтобы сначала вставить все новые поступающие данные в таблицу tmp.Затем я сравнил данные, чтобы решить, вставлять или не обновлять.

Но методы кажутся совсем не умными.

1-й метод.

select userid, name, email from tb_tmp_user B A
where userid||name||email not in(
select userid||name||email from tb_user B)

Так что я могу обновитьданные, которые изменяются, но этот метод будет слишком медленным при наличии большого количества данных.

2-й метод.

select userid, name, email from tb_tmp_user A
where not exists (
select 'x' from tb_user B where  a.userid=b.userid , a.name=b.name, a.email=b.email)

Этот метод аналогичен 1-му.Но я думаю, что есть несколько лучших методов для решения вышеупомянутого случая.

Может ли кто-нибудь предложить лучшие идеи для этого случая?Спасибо !!

1 Ответ

0 голосов
/ 19 ноября 2018

Слияние может помочь в достижении вашей задачи.

Если требуется «пометить» записи, для которых произошло обновление, согласно указанному условию, и у вас есть поле с названием «updated_on», в котором должны записываться только эти «изменения», то может помочь следующее:

MERGE
 INTO tb_user a
USING tb_tmp_user b
   ON a.user_id=b.user_id
WHEN MATCHED THEN
UPDATE
   SET a.name=b.name
      ,a.email=b.email
      ,a.updated_on = case when a.name <> b.name 
                             OR (a.name is null and b.name is not null)
                             OR (a.name is not null and b.name is null)
                           then sysdate
                          when a.email <> b.email 
                             OR (a.email is null and b.email is not null)
                             OR (a.email is not null and b.email is null)
                           then sysdate
                          else a.updated_on
                    end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...