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