2012-02-21 73 views
0

在我们的应用程序中,我们有两组表:一组工作表(包含当前分析的数据)和另一组存档表(所有数据甚至被分析过,相同的表名,但前缀为a_)。表的结构是相同的,除了归档表有一个额外的列run_id来区分不同的数据集。将表A的内容复制到表B(比表A多一列)

目前,我们有一个SQL脚本的内容复制在具有类似这样的语句:

insert into a_deals (run_id, deal_id, <more columns>) 
select maxrun, deal_id, <more columns> 
from deals, 
    (select max(run_id) maxrun from batch_runs); 

这工作得很好,但每当我们添加新列到表中,我们也有mpdify的脚本。有更好的方法来做到这一点,当我们有新的专栏时,这是稳定的。 (当然结构必须匹配,但我们希望能够不必更改脚本。)

FWIW,我们使用Oracle作为RDBMS。

+0

你需要多长时间一次同步? – tbone 2012-02-21 12:37:43

+0

每月一次或两次 - 我们每隔几个月就会有一个新的列 – Thorsten 2012-02-21 12:48:17

回答

4

在第一个答案后面,可以构建一个pl/sql过程,它将读取all_tab_columns以构建插入语句,然后立即执行。不是太难,但要小心你允许的输入参数(table_name之类)以及谁可以运行它,因为它可以为SQL注入提供很好的机会。

+0

或者只是以这种方式生成插入语句。然后让它查看并手动执行。 Jim Hudson的这种方法的好处在于,它可以覆盖所有的表格,甚至是新添加的表格,只需查看“a_”表格名称并通过删除该前缀来扣除相应的工作表格即可。 – 2012-02-21 15:40:29

+0

我喜欢存储过程的方法 - 它也可以检查我们是否忘记将工作表中的列复制到存档表中,或者甚至可以自动执行这些操作......太棒了! – Thorsten 2012-02-21 20:14:44

1

如果2代表具有相同的列以相同的顺序(从ALL_TAB_COLUMNS COLUMN_ID),除了这run_id在前面,那么你可以这样做:

insert into a_deals 
select (select max(run_id) from maxrun), d.* 
from deals 
where ...; 

这是一个偷懒的办法海事组织,和您需要确保这两列的列在这个脚本中位于相同的位置(检查all_tab_columns)。切换的2个varchar2字段将导致数据插入到不正确的字段中。

+0

我们有类似的想法,但依赖列的顺序(这是SQL中的一个实现细节)对我们来说听起来有点太冒险了。 – Thorsten 2012-02-21 14:14:13

+0

这也会给每一行不同的run_id - 每次nextval触发。 – 2012-02-21 14:17:06

+0

@JimHudson是正确的,我不确定是什么要求,只是显示插入到选择方法。这也可以是一个子选择。我会更新它。 – tbone 2012-02-21 14:20:47

相关问题