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
通过网上查询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
相关文章推荐
- Install_Oracle_Database_11g on RedHat 6.4 – problems and solution
- oracle分区索引
- Oracle 051 的几个题 (oracle 11g)
- 问题:Oracle long 类型l;结果:oracle里long类型的总结
- Oracle11g数据库监听配置
- 使用Navicat for Oracle新建表空间、用户及权限赋予
- Oracle数据库字符串连接方法
- hibernate.cfg.xml文件连接mySql、Oracle、SqlServer配置
- oracle11g安装后,本地无法登录
- ORACLE分页查询SQL语法——最高效的分页
- oracle索引原理(b-tree,bitmap,聚集,非聚集索引)
- oracle索引原理(b-tree,bitmap,聚集,非聚集索引)
- 【翻译自mos文章】访问Oracle Database的知名的Data Providers for .NET
- Oracle+Ado.Net(四)
- Oracle:Caused by: java.sql.SQLException: 流已被关闭
- Oracle简单的增删改查
- [转]oracle 数据库、表空间、实例、服务之间的关系
- oracle函数
- ORACLE分页查询SQL语法——最高效的分页
- Servlet中操作Oracle数据库