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,可能我这不是最好的方法,谁有更好的方法可以告诉我。

    心有多大,林子就有多大
  • 相关阅读:
    Powershell数据处理
    Powershell About Active Directory Group Membership of a domain user
    Powershell About Active Directory Server
    Oracle Schema Objects——Tables——TableStorage
    Oracle Schema Objects——Tables——TableType
    English Grammar
    Oracle Database Documentation
    Oracle Schema Objects——Tables——Oracle Data Types
    Oracle Schema Objects——Tables——Overview of Tables
    What is Grammar?
  • 原文地址:https://www.cnblogs.com/liuyungao/p/6509384.html
Copyright © 2011-2022 走看看