Oracle SQL合并表而不指定列

时间:2015-11-04 17:09:06

标签: sql oracle sql-merge

我有一张表people,记录少于100,000,我使用以下内容备份了此表:

create table people_backup as select * from people 

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

所以我想使用来自people的记录更新people_backup表中的记录,基于他们的主键id,我找到了两种方法:

  1. MERGE表格
  2. 使用某种fancy correlated update
  3. 大!但是,这两种方法都使用SET并让我指定要更新的列。不幸的是,我很懒,people的结构可能会随着时间的推移而改变,而我的CTAS语句不需要更新,我的更新/合并脚本需要更改,这对我来说感觉不必要的工作

    有没有办法合并整行而不必指定列?我看到here未在INSERT期间指定列将指示SQL按顺序插入值,这里是否可以应用相同的方法,这样安全吗?

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

1 个答案:

答案 0 :(得分:2)

鉴于你的桌子很小,你可以简单地

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

INSERT INTO table
  SELECT *
    FROM backup;

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