oracle中比较两表表结构差异和数据差异的方法

标签: oracle 结构 数据 | 发表时间:2015-01-01 00:14 | 作者:li2008xue2008ling
出处:http://blog.csdn.net
      在工作中需要完成这么一个需求:比较两个表的表结构是否形相同,并找出差异.比较两个表中的数据是否相同,并找出差异数据?

     分析:由于表结构中字段比较多,手工比较很浪费时间,而且不能保证不出错误.对于表中的数据那就能多了,更不能靠这种方式比较.

     为了思考问题简单和方便测试,首先先建立两个测试表,并插入一些测试数据吧,sql如下:

create table t_A
(
  id   VARCHAR2(36) not null,
  name VARCHAR2(100),
  age  NUMBER,
  sex  VARCHAR2(2)
);

insert into t_A (id, name, age, sex)
values ('1', '1', 1, '1');
insert into t_A (id, name, age, sex)
values ('2', '2', 2, '2');
commit;


create table t_B
(
  id    VARCHAR2(36) not null,
  name  VARCHAR2(100),
  age   NUMBER,
  clazz VARCHAR2(36)
);

insert into t_B (id, name, age, clazz)
values ('1', '1', 1, '1');
insert into t_B (id, name, age, clazz)
values ('2', '2', 1, '3');
insert into t_B (id, name, age, clazz)
values ('3', '3', 3, '3');
commit;

      解决过程:刚开始考虑使用存储过程,用循环比较的方式处理,首先需要找出能得到表结构的sql,查阅资料得知,在Oracle中所有表结构信息都存储在user_tab_columns中,那么查询单个表的表结构信息很简单:
select column_name from user_tab_columns where table_name = 't_A'; 
运行后发现查不到结果,为什么呢?去掉查询条件后能查询出结果,核对后发现原来在user_tab_columns中存储的内容都是大写的,原来如此,sql改为如下就可以查询出结果了:
select column_name from user_tab_columns where table_name = 'T_A'; 
写这样一个存储过程发现还是有点复杂的,网上找找有没有现成的,自己写了一会发现很复杂.网上找的时候找到了一个minus关键字.科普一下:在oracle中union 并集 intersect 交集  minus 差集;我可以用差集来实现那个需求吗?
很快就写出了sql:

/*1.比较表结构 */
(select column_name
          from user_tab_columns
         where table_name = 'T_A'
        minus
        select column_name
          from user_tab_columns
         where table_name = 'T_B')
union 
(select column_name
         from user_tab_columns
        where table_name = 'T_B'
       minus
       select column_name
         from user_tab_columns
        where table_name = 'T_A');
        

/* 2.比较表数据 */
(select *
          from t_A
        minus
        select * from t_B)
union 
(select *
         from t_B
       minus
       select * from t_A)

看看sql的运行效果吧:

表t_A结构及数据:



表t_B结构及数据:



表结构差异:


数据差异:



     反思:为什么我之前没想到用差集呢? 
1.数学没有学好,没有数学的思维.并集交集和差集的概念早就在中学学过,但数学思维没有建立,所以....得补补数学啦~
2.oracle函数不熟,看来我需要找一本oracle函数手册,没事的时候就翻翻.






作者:li2008xue2008ling 发表于2014-12-31 16:14:17 原文链接
阅读:53 评论:0 查看评论

相关 [oracle 结构 数据] 推荐:

oracle 数据库体系结构

- - Oracle - 数据库 - ITeye博客
       任何硬件平台或操作系统下的ORACLE体系结构都是相同的,包括如下四个方面:.         数据文件,日志文件,控制文件,参数文件.         表空间、段、区间、数据块.         共享池,数据缓冲区,日志缓冲区,PGA.         用户进程、服务器进程、后台进程.

oracle中比较两表表结构差异和数据差异的方法

- - CSDN博客推荐文章
      在工作中需要完成这么一个需求:比较两个表的表结构是否形相同,并找出差异.比较两个表中的数据是否相同,并找出差异数据.      分析:由于表结构中字段比较多,手工比较很浪费时间,而且不能保证不出错误.对于表中的数据那就能多了,更不能靠这种方式比较.      为了思考问题简单和方便测试,首先先建立两个测试表,并插入一些测试数据吧,sql如下:.

Oracle的索引结构

- - 数据库 - ITeye博客
 B*树索引就是我们说的“传统”索引,这是数据库中最常用的一类索引结构. 其实现与二叉查找树类似,目标是减少oracle查找数据的时间. 如果在一个数字列上有一个索引,那么理论上结构应该是这样的:.         这个树最底层是叶子节点,包含索引键以及一个rowid(指向索引行). 叶子节点上面的称为分支块,用于在结构中实现导航.

【Oracle】物理体系结构

- - CSDN博客推荐文章
一、ORACLE 物理体系结构. PGA: 私有内存区,仅供当前发起用户使用. 用户登录后的session信息会保存在PGA. 执行排序,如果内存不够,oracle会在临时表空间中完成. SGA: 包含共享池,数据缓冲区,日志缓冲区以及一些相关的进程. DATABASE: 数据最终存放的地方,其中一块区域是日志存放区.

Oracle 发布 NoSQL 数据库

- 冷月 - 博客园新闻频道
  Oracle 作为全球最大的关系型数据库提供商,在其产品链条中,也加入了 NoSQL 数据库这一环,而且这个新的数据库名字很霸气,就叫 NoSQL Database,想起了当年新浪微博更换 weibo.com 域名之时的一个笑话:. 原来有三家人做面包,张三家的面包叫三张牌面包,李四家的牌子叫李四牌面包,王五家出品的是王五牌面包,而突然有一天,张三家的面包改名了,叫面包牌面包.

Oracle数据库备份

- - Oracle - 数据库 - ITeye博客
(一)、导出/导入(EXPORT/IMPORT).   EXPORT/IMPORT是用来将ORACLE中数据移出/移入数据库.   1、EXPORT将数据库中数据备份成一个二进制系统文件称为“导出转储文件”(EXPORT. DUMP FILE),并将重新生成数据库写入文件中.   a.用户模式:导出用户所有对象以及对象中的数据;.

Oracle的体系结构概览

- - CSDN博客数据库推荐文章
声明:版本11gR2,CentOS5.8. (从11g开始password项里变为空了,以免被破解). 实例=内存(sga)+后台进程(background). 查看内存,可以通过以下视图.  后台进程,可以通过下面视图查看.   我们只关心paddr不等于0的就可以了,等于0的都是没启用. 参数文件spfilesid.ora,initsid.ora.

Oracle的存储结构关系

- - 博客园_首页
oracle数据库的整体结构                                                          .   其实,我前面一篇讲表空间的时候就介绍了数据库的结构,只是那个图只是简单的层次关系,这张图片看上去挺封复杂的,只要关注几个概念就行了. Database(数据库) :数据库是按照数据结构来组织、存储和管理数据的仓库.

数据批量导入Oracle数据库

- - Oracle - 数据库 - ITeye博客
今天学习了一个新的东西,觉得还挺有意思的,也是从别出COPY 的,. SQL*LOADER是大型数据. 仓库选择使用的加载方法,因为它提供了最快速的途径(DIRECT,PARALLEL). 现在,我们抛开其理论不谈,用实例来使. 您快速掌握SQL*LOADER的使用方法.   首先,我们认识一下SQL*LOADER.

Oracle数据库资源管理

- - 技术改变世界 创新驱动中国 - 《程序员》官网
一般来说,Oracle数据库都属于中大型的系统,这类系统的用户会话(Session),小则一两百,多则上千,这些用户会话要求Oracle数据库执行的任何指令都需要耗费系统资源,而系统资源毕竟是宝贵且有限的,一旦突然涌进大量的用户会话,对于有限的资源可能会略显不足. 但这些会话必定有轻重缓急之分,对于重要且紧急的用户会话需求理当获得多一点的系统资源,对于一些不重要或不紧急的用户会话,则可以使用较少的系统资源慢慢处理.