如何找出两个结果集中不同的数据?

周末,一个朋友微信我咨询了一个问题,简单描述来说:利用CTAS方式同步一张表时,where rownum 条件写错,现在源表(A)与目标表数据(B)不一致,并且无法直观的看到A,B表的差异,并且A表没有停止数据写入,通过应用逻辑规则原本可以明确得知需要补充的数据,但是因为ROWNUM条件写错,无法确认。此时需要对比两个表中不同的数据,采取补救数据措施。

举例说明:

现有emp(源表),emp2(问题目标表):

full_join_1可以利用SQL表连接的FULL JOIN方式,找寻emp与emp2表的不同记录:

SELECT r1.ename r1_ename,r1.job r1_job,r1.sal r1_sal,r1.num r1_num,
 r2.ename r2_ename,r2.job r2_job,r2.sal r2_sal,r2.num r2_num
FROM 
 (SELECT a.ename, a.job,a.sal,count(*) AS num FROM emp a
 GROUP BY ename,job,sal) r1 full JOIN 
 (SELECT b.ename,b.job,b.sal,count(*) AS num
 FROM emp2 b GROUP BY ename,job,sal) r2
 ON (r1.ename=r2.ename AND r1.job=r2.job AND r1.sal=r2.sal AND r1.num=r2.num);

两个表连接full_join原理,如果两表记录没有关联上,则会用NULL值显示,如上图所示,R1对应结果集与R2结果集,没有关联上的数据记录会比较直观的显示出来,可以在此SQL代码中只显示NULL值(没有关联上的数据)

full_join_3

上图中只显示出空值后的结果,因朋友的需求是“数据一致“,也就是说记录与记录数均需一致,上图中标红的记录就是因为相同记录总数不同从而没有关联上的数据。full_join这种连接方式日常工作中遇到较少,正好朋友提供了使用的需求,成功用full_join解决了问题。