zoukankan      html  css  js  c++  java
  • [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日--

  • 相关阅读:
    自制 os 极简教程1:写一个操作系统有多难
    面试官问我redis数据类型,我回答了8种
    全网最硬核讲解计算机启动流程
    cinder-volume Required RPC API Old
    Docker swarm 容器流量追踪
    postgres schema访问权限设置
    骑士cms < 6.0.48任意文件包含漏洞简记
    Socket学习
    网络编程
    交换机和路由器的区别
  • 原文地址:https://www.cnblogs.com/heyang78/p/12239597.html
Copyright © 2011-2022 走看看