A表中有一定量的数据, B表中有一定量的数据, 当B表中某些字段值和A表中的字段值一样时即认为这两条数据一致, 剔除A表中所有和B表中数据一致的记录,得出来A表独有的记录。
博客中主要用到的是exists关键字。先写sql语句:
not exists:
Select * from response_data p where not exists (
select 1 from request_data q
where p.idno=q.idno and p.create_date=q.create_date and p.type=q.type and q.type=0 AND p.result=q.result AND q.result=0);
not in:
SELECT * FROM response_data p WHERE p.idno NOT IN (
SELECT q.idno FROM request_data q
WHERE p.idno=q.idno and p.create_date=q.create_date and p.type=q.type and q.type=0 AND p.result=q.result AND q.result=0 );
---------以下为业务逻辑:
业务逻辑:
Request_data表中的数据是,公司调用收费接口的记录,收费接口有两种(type=0,1),调用结果(result=0,1);
Response_data表中的数据是,公司要求收费的一方(type=0),返回给我们的一份数据,用于公司对账(看看有没有出现,我们没有 调用他们的接口,但是他们有记录的数据, 他们有记录且调用成功的就会收费)。
由于是公司对账, 所以只需要查出来接口方提供的数据中我们表中没有的记录即可(这些记录就是多收费的记录,对于我们有记录但是接口方没有的记录,由于不需要我们付费,所以就不用理会这部分数据)。
最终数据=Response_data - Request_date
Request_date 表的数据:
Response_data 表的数据:
条件: Idno相同,日期相同, 接口方相同, 请求结果相同
Select * from response_data p where not exists
( select 1 from request_data q where p.idno=q.idno and p.create_date=q.create_date and p.type=q.type and q.type=0 AND p.result=q.result AND q.result=0);
直接执行该语句, 则会返回Response_data表的所有数据,从数据可以 看出,7号request的数据有4条, 调用接口方0,的有三条, 成功的有一条。但是这条数据的id并不等于response_data中的数据(即,接口方没有记录我们的这次成功请求,开心吧, 不用付费就用了他们的服务),也就是说,接口方多收了我们2条数据的费用。
SELECT * FROM response_data p WHERE p.idno NOT IN (SELECT q.idno FROM request_data q WHERE
p.idno=q.idno and p.create_date=q.create_date and p.type=q.type and q.type=0 AND p.result=q.result AND q.result=0 );