我有一个表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没有这些列。当有差异时,请帮我写一个这个历史表的插入。
答案 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是一个独特的键值。