我只能在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)
这与第一种方法类似。 但是我确实认为有一些更好的方法可以解决上述情况。
有人能为这种情况提供更好的主意吗? 谢谢!!
答案 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;