两表数据对比---minus .

1 引言

在程序设计的过程中,往往会遇到两个记录集的比较。如华东电网PMS接口中实现传递一天中变更(新增、修改、删除)的数据。实现的方式有多种,如编程存储过程返回游标,在存储过程中对两批数据进行比较等等。

本文主要讨论利用ORACLE的MINUS函数,直接实现两个记录集的比较。

2 实现步骤

假设两个记录集分别以表的方式存在,原始表为A,产生的比较表为B。

2.1 判断原始表和比较表的增量差异

利用MINUS函数,判断原始表与比较表的增量差异。

此增量数据包含两部分:

1)原始表A有、比较表B没有;

2)原始表A和比较表B都有,但是某些字段发生了改变。

2.2 判断比较表与原始表的增量差异

利用MINUS函数,判断比较表与原始表的增量差异。

此增量数据包含两部分:

1)比较表B有、原始表A没有;

2)比较表B和原始表A都有,但是某些字段发生了改变。

2.3 得出结果集

利用SQL语句中的对两种增量差异的处理,实现判别出比较表相对于原始表是进行了“插入”、“修改”、“删除”的情况。

3 实例演练

3.1创建表并插入数据

Create table A(A1 number(12),A2 varchar2(50));
Create table B(B1 number(12),B2 varchar2(50));
Insert Into A Values (1,'a');
Insert Into A Values (2,'ba');
Insert Into A Values (3,'ca');
Insert Into A Values (4,'da');
Insert Into B Values (1,'a');
Insert Into B Values (2,'bba');
Insert Into B Values (3,'ca');
Insert Into B Values (5,'dda');
Insert Into B Values (6,'Eda');
COMMIT;

3.2进行增量差异数据比较

3.2.1原始表A与比较表B的增量差异

Select * from A minus select * from B;

结果如下:

           A1           A2
---------------------------------------------------------------
            2          ba
            4          da

3.2.2比较表B与原始表A的增量差异

Select * from B minus select * from A;

结果如下:

           B1            B2
---------------------------------------------------------------
            2            bba
            5            dda
            6            Eda

3.2.3两种增量差异的合集

此合集包含3类数据:

--1、原始表A存在、比较表B不存在,属于删除类数据,出现次数1

--2、原始表A不存在、比较表B存在,属于新增类数据,出现次数1

--3、原始表A和比较表B都存在,属于修改类数据,出现次数2

Select A1,A2,1 t from (Select * from A minus select * from B) union
Select B1,B2,2 t from (Select * from B minus select * from A);

结果如下:

           A1                   A2               T
------------- -------------------------------------------------- ----------
            2                   ba                1
            2                   bba               2
            4                   da                1
            5                   dda               2
            6                   Eda               2

3.3得到结果

Select A1,sum(t) from
(Select A1,A2,1 t from (Select * from A minus select * from B) union
Select B1,B2,2 t from (Select * from B minus select * from A))
Group by A1;

结果如下:

           A1     SUM(T)
-----------------------
            6          2
            2          3
            4          1
            5          2

结果中SUM(T)为1的为“删除”的数据,SUM(T)为2的为“新增”的数据,SUM(T)为3的为“修改”的数据。

 

原文地址:http://blog.sina.com.cn/s/blog_3ff4e1ad0100tdl2.html

数据库中比较的差异数据通常涉及到数据对比差异分析操作,特别是使用 SQL 查询语言的时候。"minus" 或者 "except" 关键字主要用于找出第一个集合中不在第二个集合中的记录,但这不是直接用于比较整个的差异。 如果你想找出之间的新增、修改或删除记录,可以采取以下步骤: 1. **连接查询 (JOIN)**: 将通过公共字段联接起来,找出完全相同的记录。这将提供基础,然后你可以识别出不匹配的部分。 2. **左外连接 (LEFT JOIN) 或右外连接 (RIGHT JOIN)**: 对于一个,比如 A ,如果 B 中不存在对应的行,则会返回 A 的所有记录,这有助于查看哪些记录在 B 中缺失。 3. **自连接 (Self Join)**: 如果你想比较同一张的不同版本,可以用自连接并添加时间戳或其他唯一标识符作为条件。 4. **差异计算**: 使用 SELECT DISTINCT 或排除已知相同的记录后,剩下的就是新增、修改或删除的数据。 5. **插入/更新/删除 (INSERT/UPDATE/DELETE)**: 根据结果创建临时或视图,进一步分析每个操作的具体记录。 举例来说,在SQL中可能是这样的: ```sql SELECT A.column1, A.column2 FROM tableA A LEFT JOIN tableB B ON A.common_field = B.common_field WHERE B.common_field IS NULL; -- 查找A新加入的记录 SELECT A.* FROM tableA A INNER JOIN tableB B ON A.common_field = B.common_field WHERE A.data_value != B.data_value; -- 查找有改动的记录 DELETE FROM tableA WHERE common_field NOT IN (SELECT common_field FROM tableB);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值