Oracle SQL 不指定列合并表

Oracle SQL merge tables without specifying columns

我有一个 table people,记录少于 100,000 条,我已经使用以下方法备份了这个 table:

create table people_backup as select * from people 

随着时间的推移,我向 people table 添加了一些新记录,但最终我想将备份 table 中的记录合并到 people 中。不幸的是我不能简单地 DROP 我的 table 因为我的新记录将会丢失!

所以我想根据主键 id 使用 people_backup 中的记录更新 people table 中的记录,我找到了两种方法要做到这一点:

  1. MERGE table 在一起
  2. 使用某种 fancy correlated update

太棒了!但是,这两种方法都使用 SET 并让我指定要更新的列。不幸的是,我很懒惰,people 的结构可能会随着时间的推移而改变,虽然我的 CTAS 语句不需要更新,但我的 update/merge 脚本将需要更改,这感觉像是不必要的工作对我来说。

有没有一种无需指定列即可合并整行的方法?我看到 hereINSERT 期间不指定列将指示 SQL 按顺序插入值,可以在此处应用相同的方法吗,这安全吗?

注意:table 的结构在备份之间不会改变

鉴于您的table很小,您可以简单地

DELETE FROM table t
 WHERE EXISTS( SELECT 1
                 FROM backup b
                WHERE t.key = b.key );

INSERT INTO table
  SELECT *
    FROM backup;

这很慢而且不是特别优雅(特别是如果备份中的大部分数据没有更改)但假设两个 table 中的列匹配,它确实允许您不列出列。就个人而言,我更喜欢写出列名(大概那些不会经常更改)以便我可以进行更新。