将旧表中的数据合并到新表中以进行每月归档。

4
我有一个SQL语句用于将数据插入到一个表中进行归档,但我需要一个合并语句每月运行一次,以便将旧表(1)中更改的任何数据更新到新表(2)中,这些数据现在应该被移动到存档中。
问题的一部分是从旧表中删除已移动的数据。我的插入没有做到这一点,但我需要让保存的数据从原始表中清除。
是否有单个SQL语句可以以这种方式将数据从一个表移动到另一个表?还是需要进行两步操作?
最初的语句根据年龄和其他几个相关因素移动数据。 插入语句是:
INSERT /*+ append */ 
  INTO tab1
SELECT *
  FROM tab2
 WHERE (Postingdate < TO_DATE ('2001/07/01', 'yyyy/mm/dd')
       OR jobname IS NULL)
   AND STATUS <> '45';

需要帮助,感激不尽...


您可以通过交换分区来实现此操作:http://docs.oracle.com/cd/E11882_01/server.112/e26088/statements_3001.htm#BABHHAHF - Jon Heller
2个回答

0

merge语句可以通过在更新子句中添加删除语句来让您在一个语句中完成。请参阅Oracle合并文档


但是插入和删除操作只会影响目标表。 - Jon Heller
那么还需要另外一个删除语句来从源表中删除数据吗? - Michelle Daniel
1
你说得对,我没有注意到删除操作是针对源表的。我认为这个问题没有“一劳永逸”的解决方案(除非你考虑向任一表添加触发器)——你需要在插入后编写一个等效的删除语句。如果你的postingdate列中的值一旦设置就不会更改,那么就不应该有任何数据完整性问题。 - John Doyle
一个删除触发器会是一个“插入后”触发器吗?有这样的触发器吗? - Michelle Daniel
是的,你可以有一个“插入后”触发器。或者如果你想在旧表上放置触发器以便在从中删除条目时运行插入,则可以有一个“删除后”触发器。 - John Doyle

0

我认为你应该尝试使用分区表来实现。我的想法是创建一个以日期为范围分区的表:

create table(id number primary key,name varchar,J_date date )
partition by range(J_date)(PARTITION one_mnth VALUES LESS THAN(sysdate-30)),
partition by range(J_date)(PARTITION one_mnth VALUES LESS THAN(maxvalue)));

然后将该分区移动到另一个表中,并截断该分区。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接