仅当在oracle上更改数据时,才如何更新数据?

时间:2018-11-19 02:29:59

标签: sql database oracle mysqli

我只能在oracle更改数据时知道如何更新数据吗?

例如,表tb_user

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

我只想在其中一个字段更改时更新数据。

我尝试合并到方法中。 但它会更新或插入而无需任何检查。

现在,我创建了一个tmp表tb_tmp_user,以便将所有新数据首先插入到tmp表中。 然后,我比较了数据以决定不插入还是不更新。

但是这些方法似乎一点都不聪明。

第一种方法。

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

所以我可以更新已更改的数据,但是当有大量数据时,此方法将太慢。

第二种方法。

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 个答案:

答案 0 :(得分:1)

合并可以帮助您完成任务。

如果要求按照上述条件“标记”已发生更新的记录,并且您有一个字段“ 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;