[原]用SQL比较两张结构完全相同的表数据

Posted 勇哥的部落格

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[原]用SQL比较两张结构完全相同的表数据相关的知识,希望对你有一定的参考价值。

  前几天面试遇到一个比较有意思的问题,就是有两张结构完全相同的表A和B,但是这两张表属于不同的业务流程,经过一段时间后发现两张表的数据不能完全匹配,有可能A比B多,也可能B比A多,或者两种可能同时存在,需要写SQL找出两张表的差异。当时我就随便写了一个left join的方式通过on不等于来找出差异,今天测试了一下是不行的。下面是重新写得可行方法:

CREATE TABLE `test_a` (
  `trade_id` varchar(20) NOT NULL,
  `user_id` varchar(20) DEFAULT NULL,
  `amount` double DEFAULT NULL,
  PRIMARY KEY (`trade_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `test_b` (
  `trade_id` varchar(20) NOT NULL,
  `user_id` varchar(20) DEFAULT NULL,
  `amount` double DEFAULT NULL,
  PRIMARY KEY (`trade_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

INSERT INTO `test_a` (`trade_id`,`user_id`,`amount`) VALUES (t0001,u0001,100);
INSERT INTO `test_a` (`trade_id`,`user_id`,`amount`) VALUES (t0002,u0005,29.8);
INSERT INTO `test_a` (`trade_id`,`user_id`,`amount`) VALUES (t0003,u0002,3050);
INSERT INTO `test_a` (`trade_id`,`user_id`,`amount`) VALUES (t0004,u0003,128.4);
INSERT INTO `test_a` (`trade_id`,`user_id`,`amount`) VALUES (t0005,u0004,33.7);

INSERT INTO `test_b` (`trade_id`,`user_id`,`amount`) VALUES (t0001,u0001,100);
INSERT INTO `test_b` (`trade_id`,`user_id`,`amount`) VALUES (t0002,u0005,29.8);
INSERT INTO `test_b` (`trade_id`,`user_id`,`amount`) VALUES (t0003,u0002,3050);
INSERT INTO `test_b` (`trade_id`,`user_id`,`amount`) VALUES (t0004,u0003,128.4);
INSERT INTO `test_b` (`trade_id`,`user_id`,`amount`) VALUES (t0005,u0004,33.7);
INSERT INTO `test_b` (`trade_id`,`user_id`,`amount`) VALUES (t0006,u0006,19.6);

 

select * from test_a where concat(concat(trade_id,user_id),amount) not in(
select concat(concat(a.trade_id,a.user_id),a.amount) from test_a as a left join test_b as b on a.trade_id=b.trade_id)
union
select * from test_b where concat(concat(trade_id,user_id),amount) not in(
select concat(concat(a.trade_id,a.user_id),a.amount) from test_a as a left join test_b as b on a.trade_id=b.trade_id)

思路:先将两张表相同的数据找出来,然后分别用表A和表B和找出来相同数据作对比得出差异,最后把差异数据union,可能我这不是最好的方法,谁有更好的方法可以告诉我。

 

以上是关于[原]用SQL比较两张结构完全相同的表数据的主要内容,如果未能解决你的问题,请参考以下文章

如何对比两个相同数据库表的不同

两张结构相同的表合并到一起的sql语句

sql 两张结构相同的表,当A表中的某个字段发生变化时,B表中的字段更新成相对应的值。

oracle如何比较两个表数据的差异?

Oracle中,写存储过程,如何比较两条记录是不是相同,两条记录分别来自两张表,表结构相同

怎样用Sql语句判断一张表中的两条数据相同