然后插入然后从oracle表中删除行

时间:2014-02-11 18:27:23

标签: sql oracle

我想知道是否有更好的方法来做到这一点。该语句将所有行发生在6个月以上,并将它们放入存档表中。然后它会获取两个表中的所有ID,并将它们从主表中删除。任何想法?

INSERT INTO ArchiveTable
    SELECT *
    FROM MainTable
    WHERE DateItHappened < (SYSDATE - 180);

DELETE FROM MainTable a
   WHERE a.ID IN (
   SELECT b.ID 
   FROM ArchiveTable b 
   JOIN MainTable a
     ON b.ID = 
        a.ID);

更新

我继续执行以下Joe的建议,使其成为最终代码。如果有人有任何改变,请告诉我。

INSERT INTO ArchiveTable
    SELECT *
    FROM MainTable
    WHERE DateItHappened < (SYSDATE - 180);

DELETE FROM maintable a
    WHERE EXISTS (SELECT 1         
     FROM archivetable b
    WHERE a.id = b.id)

3 个答案:

答案 0 :(得分:1)

可以简化DELETE:

DELETE FROM maintable a
 WHERE EXISTS (SELECT 1
                 FROM archivetable b
                WHERE a.id = b.id)

答案 1 :(得分:1)

我通常的方法是使用全局临时表来存储我从源表移动到目标表的行的rowid,然后使用该集执行删除。它使得不稳定的初始数据集等问题100%安全。

insert all
  into archivetable (col1, col2 ...)
  values (col1, col2 ...)
  into maintable_deletes (delete_rowid)
  values (rowid)
select rowid, *
from   maintable;

delete from maintable
where  rowid in (select delete_rowid from maintable_deletes);

commit;

GTT非常有用,因为它可以在提交时删除自己的行。

答案 2 :(得分:0)

在SQL Server中它可能是,但是oracle没有内置方法来执行此操作:

delete m
output deleted.ColumnA, deleted.ColumnB
into ArchiveTable
from 
MainTable m
where DateItHappened < (SYSDATE - 180);