您的位置:首页 > 数据库 > Oracle

Oracle Minus(差集) 同步数据常用

2015-09-01 11:03 543 查看
最近项目要做数据同步,oracle中两张表结构完全相同的表,a,b。要从a表中向b表中刷数据,如果使用程序需要一列一列比较,比较繁琐,

通过网上查询Minus关键字,可以处理这个问题,

减少在程序中一列一列比较,大大减少了代码量。

其实,就是两个表关联了,网上查了查,minus正好符合需求。

用如下类似语句

select * from a 

minus

select * from b 

结果:可以查询出表a中存在而表b中不存在的数据信息,且a表和b表不一样的数据,以a表数据为准。

例如: (1)a表和b表都存在一行id一样的数据,但是name不一样的数据,则会把这行查询出,且以a表的name为准

   (2)a表比b表多出来的数据,会被查询出来
     

Oracle Minus关键字

  SQL中的MINUS关键字

  SQL中有一个MINUS关键字,它运用在两个SQL结果集上,它先找出第一条SQL语句所产生的结果,然后看这些结果有没有在第二个SQL语句的结果中。如果第二个SQL语句所产生的结果并没有存在于第一个SQL语句所产生的结果内,那这笔资料就被抛弃,其语法如下:

  [SQL Segment 1]

  MINUS

  [SQL Segment 2]

--------------------------------------------

//创建表1

create table A

(

 id varchar(10),

 name varchar(10),

 sex varchar(10),

);

insert into A values('1','test','female');

insert into A values('2','test22','female');

insert into A values('3','test3','female');

insert into A values('4','test4','female');

insert into A values('5','test5','female');

insert into A values('6','testtest','female');

//创建表2

create table B

(

 id varchar(10),

 name varchar(10),

 sex varchar(10),

);

insert into B values('1','test1','female');

insert into B values('2','test2','female');

insert into B values('3','test3','female');

insert into B values('4',test4','female');

insert into B values('5','test5','female');

-------------------------------------------

select * from A minus select * from B;

结果:

ID         NAME       SEX            

----------  ----------     ---------- 

1           test      female             

2           test22    female  

6           testtest female 

-----------------------------------------------------------

select * from B minus select * from A;

结果:

ID         NAME       SEX            

----------  ----------     ---------- 

1           test1          female             

2           test2      female 

select id from A minus select id from B;

结果:

ID               

-----

6           

可以单独比较一列id,看出A表比B表

如果我们要把A表同步到B表

1.新增的(A表比B表多出来的数据):

select * from A where id in (select id from A minus select id from B);

2.修改的(A表与B表不想同的数据):

select * from (select * from A minus select * from B ) t where id not exists (select id from A minus select id from B);

注意:这里是t结果集查询的是有修改的还有A表比B表多出来的,所以把多出来的去除掉加上后面where条件。

3.删除的(B表比A表多出来的数据):

select * from B where id in (select id from B minus select id from A);

注意事项:

如果比较的列类型不一致则会报错,可以通过Oracle类型转换来进行处理。

结论:Minus返回的总是左边表中的数据,它返回的是差集。注意:minus有剃重作用

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

 下面是我做的实验,很明显能够看出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

参考自:http://blog.csdn.net/greenappple/article/details/7073349
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: