SQL 当前表与历史表字段对比 两个表结构相同(在线等小弟只有20分了非常感谢)
有三个表A(当前表),B(历史表),C(对比表)A与B根据nameID和YM对比找出两表中不同的信息 然后把不同信息插入到表C中,
table A(当前表)YM和nameId为主键
YM(期次) name nameId adress
201309 张三 01 济南
table B(历史表) YM和nameId为主键
YM(期次) name nameId adress
201308 李四 01 泰安
A与B对比后不同信息如下表C
table C(对比表) YM,nameId,tbCode和fdCode为主键
YM(期次) nameId tbCode(变更字段所在表) fdCode(变更字段) last(变更前内容) end(变更后内容)
201309 01 A name 李四 张三
201309 01 A adress 泰安 济南
[解决办法]
左连接 判断值
[解决办法]
是 nameId 相同其他字段不同就计入C表?
[解决办法]
是以当前表为对照表吗 ?
with tableA as
(
select '201309' ym,'张三' name,'01' nameid,'济南' adress from dual union all
select '201309' ym,'丢丢' name,'02' nameid,'北京' adress from dual
),tableB as
(
select '201308' ym,'李四' name,'01' nameid,'南京' adress from dual union all
select '201308' ym,'豆豆' name,'02' nameid,'北京' adress from dual
)
select ym,nameid,'A' tbCode,'name' fdCode,n1 last,n2 end
from (
select a.nameid,a.ym,a.name n1,b.name n2
from tableA a left join tableB b on a.nameid = b.nameid
where a.name<>b.name )
union all
select ym,nameid,'A' tbCode,'adress' fdCode,a1 last,a2 end
from (
select a.nameid,a.ym,a.adress a1,b.adress a2
from tableA a left join tableB b on a.nameid = b.nameid
where a.adress<>b.adress)
ym nameid tbCode fdCode last end
-----------------------
120130901Aname张三李四
220130902Aname丢丢豆豆
320130901Aadress济南南京
insert into tableC
select ym,nameid,tbCode,fdCode,last,end
from
(
select ym,nameid,'A' tbCode,'name' fdCode,n1 last,n2 end
from (
select a.nameid,a.ym,a.name n1,b.name n2
from tableA a left join tableB b on a.nameid = b.nameid
where a.name<>b.name )
union all
select ym,nameid,'A' tbCode,'adress' fdCode,a1 last,a2 end
from (
select a.nameid,a.ym,a.adress a1,b.adress a2
from tableA a left join tableB b on a.nameid = b.nameid
where a.adress<>b.adress)
)
create table A(ym int, name varchar2(12), nameId varchar2(10), address varchar2(100));
create table B(ym int, name varchar2(12), nameId varchar2(10), address varchar2(100));
create table C(
ym int, nameId varchar2(10), tbCode varchar2(10),
fdCode varchar2(15), last varchar2(100), end varchar2(100)
);
insert into A(ym, name, nameId, address) values(201309, '张三', '01', '济南');
insert into B(ym, name, nameId, address) values(201309, '李四', '01', '泰安');
declare
cursor c1 is
select a.*, b.name b_name, b.address b_address
from A, B
where a.nameId=b.nameId and a.ym=b.ym;
v_sql varchar2(1024);
v_sql_pre varchar2(100);
begin
for c1_res in c1 loop
v_sql_pre := 'insert into c(ym, nameId, tbCode, fdCode, last, end) values('
[解决办法]
c1_res.ym
[解决办法]
', '''
[解决办法]
c1_res.nameId
[解决办法]
''', ''A'', ';
if c1_res.name != c1_res.b_name then
v_sql := v_sql_pre
[解决办法]
'''name'', '''
[解决办法]
c1_res.name
[解决办法]
''', '''
[解决办法]
c1_res.b_name
[解决办法]
''')';
execute immediate v_sql;
end if;
if c1_res.address != c1_res.b_address then
v_sql := v_sql_pre
[解决办法]
'''address'', '''
[解决办法]
c1_res.address
[解决办法]
''', '''
[解决办法]
c1_res.b_address
[解决办法]
''')';
execute immediate v_sql;
end if;
end loop;
end;
/
select * from c;
用merge吧,很简单