插入历史表 - oracle SQL - PL / SQL

时间:2016-05-17 23:02:21

标签: sql oracle plsql

我有一个表X和表Y.表Y是历史表。每当在表X中插入或更新或删除记录时,它将被插入历史表Y中。现在我尝试用缺失的记录更新历史表。为此我写了一个减号查询来获得差异。我必须将所有这些记录插入历史表中。我尝试使用' merge'和其他形式的插入语句,但无法获得准确的输出。

EX:

表X

  A         B          C
EMP NO  EMP NAME    EMP ADD

表Y

A          B           C      D        E        F
EMP NO  EMP NAME    EMP ADD st dt   end dt  indicator

插入时我必须使用三个额外的列作为具有日期和指示符的值,因为表X没有这些列。当有差异时,请帮我写一个这个历史表的插入。

2 个答案:

答案 0 :(得分:1)

有几种不同的方法可以做到这一点。一种是使用not exists

insert into tabley (Y, A, B, C, EMPNO, EMPNAME, EMPADD)
select X, A, B, C, EMPNO, EMPNAME, EMPADD
from tablex x
where not exists (
    select 1 
    from tabley
    where tabley.y = x.X
    )

只需确保为插入定义相同数量的列,就像对select一样。根据其他字段的来源,您也可以提供它们 - 取决于您的样本数据和预期结果。

顺便说一句,这假设x中的tablex值是您的唯一标识符。如果没有,您需要更新上面的where条件。

答案 1 :(得分:0)

您需要为表x中的缺失列创建数据(格式化以提高可读性):

insert into tabley(empno
                 , empname
                 , empadd
                 , st_dt
                 , end_dt
                 , indicator)
select empno
     , empname
     , empadd
     , to_date(some_date_you_create)
     , to_date(another_date_or null)
     , (whatever_starting_indicator_value_is_allowed)
  from tablex x
 where not exists (select 1
                     from tabley y
                    where x.empno = y.empno);

基本上,您必须使用您决定的任意内容创建缺失值。这也假设empno是一个独特的键值。