简述
在日常业务中可能会涉及到两份数据或者两个表
无唯一键
的数据对比,下面统称为两份数据,当然这两份数据的列名要保持一致,不然很难在SQL代码中做对比。
可能的场景
1、新旧系统运行同一个功能,对产生的数据进行对比
2、同一个表的两份数据对比
3、不同库的同一个表的数据对比
。。。
实践
一、预期方案
1)利用 exists
2)利用 left join
3)利用 minus
假设两份数据为表1、表2,我实践证明,
若每一行不会出现重复数据,三种方案都可行,且推荐方案3;
若出现重复数据则都不可行,
如表1有多条一样的数据A,而表2也有一条或者多条数据A但是行数比表1少
,此时对比结果却是两边一样,但这不符合我们的诉求。
最后经过我研究,利用minus 结合partition by可完全满足上边的情况。
二、实际方案讲解
创建一个demo表
create table ddd(
username varchar2(300),
age int,
score int
);
插入测试数据
insert into ddd values('a',12,12);
insert into ddd values('a',12,12);
insert into ddd values('a',12,12);
insert into ddd values('a',12,12);
insert into ddd values('a',12,13);
insert into ddd values('a',12,13);
insert into ddd values('a',12,13);
insert into ddd values('a2',33,14);
insert into ddd values('a2',33,14);
对比score=12与13的两份数据:
select row_number() over (partition by username,age order by 1) rank,username,age from ddd t where t.score=12
minus
select row_number() over (partition by username,age order by 1) rank,username,age from ddd t where t.score=13;
原理:
1、利用partition by分组,分组的字段就用minus的对比的所有字段,
2、再对组内的每一行排个序,order by 1是固定的,row_number() over 是用来产生序号。
效果如下:
版权声明:本文为qq_31499975原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。