[oracle/Sql]怎样比较两表的差异?

比如有这么一个表:

create table test02(
   id number(8,0) primary key,
   name nvarchar2(20),
   sal number(5,0)
)

可以这样给它充值:

insert into test02 
select rownum,dbms_random.string('*',dbms_random.value(6,20)),dbms_random.value(1000,30000)  from dual
connect by level<=200
order by dbms_random.random

然后以此建立一张新表:

create table test03 as select * from test02;

现在 test02,test03内容都是一致的。

 

但在漫长的生活中,风化和侵袭会导致两者有所不同,下面用更新语句来模拟两者产生的变化:

update test02 set name='bill' where id=1;
update test02 set name='andy' where id=2;

update test03 set sal=22222 where id=22;
update test03 set sal=33333 where id=33;
update test03 set sal=44444 where id=44;

这样,两表就产生了五条数据的不同,那么怎么通过sql语句知道不同点呢?可以执行下面SQL:

select t2.*,t3.* from test02 t2 full join test03 t3 on (t2.name=t3.name and t2.sal=t3.sal)
where (t2.id IS NULL or t3.id IS NULL) order by t2.id,t3.id

执行效果:

复制代码
SQL> select t2.*,t3.* from test02 t2 full join test03 t3 on (t2.name=t3.name and t2.sal=t3.sal)
  2  where (t2.id IS NULL or t3.id IS NULL) order by t2.id,t3.id;

        ID NAME                                            SAL         ID NAME                                    SAL
---------- ---------------------------------------- ---------- ---------- ---------------------------------------- ----------
         1 bill                                          11595
         2 andy                                          23646
        22 CTCUCDUAOFEDWDOSZJ                            24070
        33 SRMKTDAHKCSKMU                                 5758
        44 ZCFLYSMOSHYWNX                                22652
                                                                        1 ZUNZKJEEDGTHC                         11595
                                                                        2 SGRNZOIFBMITAMKSYTQE                  23646
                                                                       22 CTCUCDUAOFEDWDOSZJ                    22222
                                                                       33 SRMKTDAHKCSKMU                        33333
                                                                       44 ZCFLYSMOSHYWNX                        44444

已选择10行。
复制代码

 

如果是两表没有差别呢?让我们以test02为基础创建一个test04来模拟:

create table test04 as select * from test02;

再比较一下:

SQL> select t2.*,t4.* from test02 t2 full join test04 t4 on (t2.name=t4.name and t2.sal=t4.sal)
  2  where (t2.id IS NULL or t4.id IS NULL) order by t2.id,t4.id;

未选定行

这便是两表完全一致的情况。

以上的方法也适用于View和查询结果的比较。

--2020年1月29日--

 

posted @   逆火狂飙  阅读(2040)  评论(2编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
历史上的今天:
2015-01-29 【Canvas与艺术】红色凯尔特结
2015-01-29 Java环境变量设置
2015-01-29 Win7安装软件,界面上中文显示乱码的解决方案
2014-01-29 【Canvas技法】勾画十二齿斜齿齿轮轮廓
2014-01-29 【Java与排列组合】某年高考选择题:1,3,5,7,9中选两个,0,2,4,6,8中选两个,组成的无重复四位数有几个?
生当作人杰 死亦为鬼雄 至今思项羽 不肯过江东
点击右上角即可分享
微信分享提示