zoukankan      html  css  js  c++  java
  • [原]用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,可能我这不是最好的方法,谁有更好的方法可以告诉我。

    心有多大,林子就有多大
  • 相关阅读:
    解释一下什么是servlet?
    HTTP请求的GET与POST方式的区别
    金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)->(一千零一拾一元整)输出?
    Java中的异常处理机制的简单原理和应用。
    error和exception有什么区别?
    运行时异常与一般异常有何异同?
    jsp有哪些动作?作用分别是什么?
    jsp有哪些内置对象?作用分别是什么? 分别有什么方法?
    一个纸杯的测试用例
    白盒测试黑盒测试区别
  • 原文地址:https://www.cnblogs.com/liuyungao/p/6509384.html
Copyright © 2011-2022 走看看