在工作中经常会遇到导数据的情况,有时候需要比较生产库和测试库的表结构是否有变化,找出差异,并且可以找出差异数据。
分析:手工方式不可取,因为要比较的表结构比较多,不容易看出来,采取两表差集并集的方式查找。
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