1. 程式人生 > >oracle中比較兩表表結構差異和資料差異的方法

oracle中比較兩表表結構差異和資料差異的方法

在工作中經常會遇到導資料的情況,有時候需要比較生產庫和測試庫的表結構是否有變化,找出差異,並且可以找出差異資料。

分析:手工方式不可取,因為要比較的表結構比較多,不容易看出來,採取兩表差集並集的方式查詢。

MINUS(差集):

SQL中有一個MINUS關鍵字,它運用在兩個SQL語句上,它先找出第一條SQL語句所產生的結果,然後看這些結果有沒有在第二個SQL語句的結果 中。如果有的話,那這一筆記錄就被去除,而不會在最後的結果中出現。如果第二個SQL語句所產生的結果並沒有存在於第一個SQL語句所產生的結果內,那這 筆資料就被拋棄。

INTERSECT (交集)
UNION ALL 並集

具體如下:

首先插入建測試表和測試資料:

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形式:
(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')  

表結構差異:

column_name
<span style="color: rgb(51, 51, 51); font-family: Arial; font-size: 18px; line-height: 26px;">CLAZZ</span>
<span style="color: rgb(51, 51, 51); font-family: Arial; font-size: 18px; line-height: 26px;"><span style="color: rgb(51, 51, 51); font-family: Arial; font-size: 18px; line-height: 26px;">SEX</span>
</span>

也可以查詢資料的差集,另外差集的效率還是挺高的。

===========================================================================================================

下面是我做的實驗,很明顯能夠看出MINUS的效率,made_order共23萬筆記錄,charge_detail共17萬筆記錄

效能比較:
  SELECT order_id FROM made_order
  MINUS
  SELECT order_id FROM charge_detail
  1.14 sec
  
  SELECT a.order_id FROM made_order a
  WHERE NOT exists (
   SELECT order_id
   FROM charge_detail
   WHERE order_id = a.order_id
   )
  18.19 sec
  
  SELECT order_id FROM made_order
  WHERE order_id NOT in (
   SELECT order_id
   FROM charge_detail
   )
  20.05 sec