[原]用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,可能我這不是最好的方法,誰有更好的方法可以告訴我。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM