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 中的记录,我找到了两种方法要做到这一点:
- MERGE table 在一起
- 使用某种 fancy correlated update
太棒了!但是,这两种方法都使用 SET
并让我指定要更新的列。不幸的是,我很懒惰,people
的结构可能会随着时间的推移而改变,虽然我的 CTAS
语句不需要更新,但我的 update/merge 脚本将需要更改,这感觉像是不必要的工作对我来说。
有没有一种无需指定列即可合并整行的方法?我看到 here 在 INSERT
期间不指定列将指示 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 中的列匹配,它确实允许您不列出列。就个人而言,我更喜欢写出列名(大概那些不会经常更改)以便我可以进行更新。
我有一个 table people
,记录少于 100,000 条,我已经使用以下方法备份了这个 table:
create table people_backup as select * from people
随着时间的推移,我向 people
table 添加了一些新记录,但最终我想将备份 table 中的记录合并到 people
中。不幸的是我不能简单地 DROP
我的 table 因为我的新记录将会丢失!
所以我想根据主键 id
使用 people_backup
中的记录更新 people
table 中的记录,我找到了两种方法要做到这一点:
- MERGE table 在一起
- 使用某种 fancy correlated update
太棒了!但是,这两种方法都使用 SET
并让我指定要更新的列。不幸的是,我很懒惰,people
的结构可能会随着时间的推移而改变,虽然我的 CTAS
语句不需要更新,但我的 update/merge 脚本将需要更改,这感觉像是不必要的工作对我来说。
有没有一种无需指定列即可合并整行的方法?我看到 here 在 INSERT
期间不指定列将指示 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 中的列匹配,它确实允许您不列出列。就个人而言,我更喜欢写出列名(大概那些不会经常更改)以便我可以进行更新。