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

本文介绍了一种使用Oracle SQL中的MINUS关键字来高效比较两个表的结构和数据差异的方法,通过具体示例展示了如何查找不同之处。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

原作者:li2008xue2008ling

      在工作中需要完成这么一个需求:比较两个表的表结构是否形相同,并找出差异.比较两个表中的数据是否相同,并找出差异数据?

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

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

  1. create table t_A  
  2. (  
  3.   id   VARCHAR2(36) not null,  
  4.   name VARCHAR2(100),  
  5.   age  NUMBER,  
  6.   sex  VARCHAR2(2)  
  7. );  
  8.   
  9. insert into t_A (id, name, age, sex)  
  10. values ('1''1', 1, '1');  
  11. insert into t_A (id, name, age, sex)  
  12. values ('2''2', 2, '2');  
  13. commit;  
  14.   
  15.   
  16. create table t_B  
  17. (  
  18.   id    VARCHAR2(36) not null,  
  19.   name  VARCHAR2(100),  
  20.   age   NUMBER,  
  21.   clazz VARCHAR2(36)  
  22. );  
  23.   
  24. insert into t_B (id, name, age, clazz)  
  25. values ('1''1', 1, '1');  
  26. insert into t_B (id, name, age, clazz)  
  27. values ('2''2', 1, '3');  
  28. insert into t_B (id, name, age, clazz)  
  29. values ('3''3', 3, '3');  
  30. 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. /*1.比较表结构 */  
  2. (select column_name  
  3.           from user_tab_columns  
  4.          where table_name = 'T_A'  
  5.         minus  
  6.         select column_name  
  7.           from user_tab_columns  
  8.          where table_name = 'T_B')  
  9. union   
  10. (select column_name  
  11.          from user_tab_columns  
  12.         where table_name = 'T_B'  
  13.        minus  
  14.        select column_name  
  15.          from user_tab_columns  
  16.         where table_name = 'T_A');  
  17.           
  18.   
  19. /* 2.比较表数据 */  
  20. (select *  
  21.           from t_A  
  22.         minus  
  23.         select * from t_B)  
  24. union   
  25. (select *  
  26.          from t_B  
  27.        minus  
  28.        select * from t_A)  

看看sql的运行效果吧:

表t_A结构及数据:



表t_B结构及数据:



表结构差异:


数据差异:



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






版权声明:本文为博主原创文章,未经博主允许不得转载。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值