【前言】
本期汇总了Oracle数据库两张表间使用SQL进行差集查询的四种方法,主要应用于表复制后进行数据比对的情况,四种方法有各自较合适的使用场景。
【准备工作】
新建两张表stu1和stu2,表结构和数据如下图。
stu1表结构如下:
stu2表结构如下:
stu1数据如下:
stu2数据如下:
1.1.NOT EXISTS
意思是不在此范围内的,用来比对两张表的某一个列是否存在差集,两张表列数可不一致,按列来查询(支持不一致的列数据类型)。
1.1.1. 找出stu1存在,但stu2不存在的NAME(数据类型一致)
SELECT * FROM stu1 a WHERE NOT EXISTS (SELECT * FROM stu2 b WHERE a.NAME = b.NAME);
1.1.2. 找出stu1存在,但stu2不存在的AGE(数据类型不一致)
SELECT * FROM stu1 a WHERE NOT EXISTS (SELECT * FROM stu2 b WHERE a.AGE = b.AGE);
1.2.NOT IN
类似于NOT EXISTS,但如果查询的列存在空值的话,将导致查询结果为空。
1.2.1. 找出stu1存在,但stu2不存在的NAME(stu2存在空值)
stu1
stu2
SELECT * FROM stu1 a WHERE a.NAME NOT IN (SELECT b.NAME FROM stu2 b);
1.2.2. 找出stu1存在,但stu2不存在的NAME(stu2存在空值,但给出条件)
SELECT * FROM stu1 a WHERE a.NAME NOT IN (SELECT b.NAME FROM stu2 b WHERE a.NAME = b.NAME);
1.3.UNION ALL
union all本身的用法是合并两个或以上select语句的结果集,相同数据不合并,这里的思路是对union all结果集搜索出相同数据数量只为1的结果(即为stu1和stu2的差集)。
需注意的,两张表选择进行对比的列的数据类型需保持一致,列数也不一致。
1.3.1. 找出两张表的差集(列的数据类型一致)
SELECT ID,NAME,AGE FROM(SELECT id,name,age
FROM stu1 UNION all SELECT id,name,age FROM stu2) GROUP BY ID,NAME,AGE HAVING count(*)=1 ORDER BY ID;
1.3.2. 找出两张表的差集(列的数据类型不一致)
1.4.MINUS
差集运算,同步数据常用。表结构需保持一致。
1.4.1. 表结构不一致
1.4.2. 表结构一致
stu1
stu2
SELECT * FROM stu1 MINUS SELECT * FROM stu2;
1.4.3. 表结构一致(存在空值也可查出)
stu1
stu2
SELECT * FROM stu1 MINUS SELECT * FROM stu2;