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

时间: 2024-11-16 23:01:01

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

如何复制表结构、如何复制表数据:

1. 复制表的结构及其中的数据: create table new_table_name as select * from old_table_name 2. 只复制表的结构: create table new_table_name as select * from old_table_name where 1=2;(这里的“常量条件”1=2是恒不成立的,这句话我的理解是这样的:如果在不加where条件时,会复制表结构和表里的全部数据,加上一个条件1=2后,就是说找不到符合这个条件的记录,当然就

Sql Server 导入还有一个数据库中的表数据

在涉及到SQL Server编程或是管理时一定会用到数据的导入与导出, 导入导出的方法有多种,此处以SQL Server导入表数据为例.阐述一下: 1.打开SQL Server Management Studio.在对象资源管理器中,展开"SQL Server 实例"→"数据库"→"你须要导入数据的数据库"节点.单击鼠标右键,选择"任务"→"导出数据"命令. 出现导入和导出向导的欢迎界面,单击"下

Sql Server 导入另一个数据库中的表数据

在涉及到SQL Server编程或是管理时一定会用到数据的导入与导出, 导入导出的方法有多种,此处以SQL Server导入表数据为例,阐述一下: 1.打开SQL Server Management Studio,在对象资源管理器中,展开"SQL Server 实例"→"数据库"→"你需要导入数据的数据库"节点,单击鼠标右键,选择"任务"→"导出数据"命令.出现导入和导出向导的欢迎界面,单击"下一

SQL SERVER大话存储结构(3)_数据行的行结构

一行数据是如何来存储的呢? 变长列与定长列,NULL与NOT NULL,实际是如何整理存放到 8k的数据页上呢? 对表格进行增减列,修改长度,添加默认值等DDL SQL,对行存储结构又会有怎么样的影响呢? 什么是大对象,什么是行溢出,存储引擎是如何处理它们呢? 如果转载,请注明博文来源: www.cnblogs.com/xinysu/   ,版权归 博客园 苏家小萝卜 所有.望各位支持! 1 引入 在一个DB内,每一个table都能在sys.sysobjects中找到对应的描述,每一个列,都能从

两张图说清楚名称节点和数据节点

sql 数据库中用创建好的视图修改表数据

只要满足下列条件,即可通过视图修改基础基表的数据: 1.任何修改(包括 UPDATE.INSERT 和 DELETE 语句)都只能引用一个基表的列. 2.视图中被修改的列必须直接引用表列中的基础数据.不能通过任何其他方式对这些列进行派生,如通过以下方式: 1)聚合函数:AVG.COUNT.SUM.MIN.MAX.GROUPING.STDEV.STDEVP.VAR 和 VARP.2)计算.不能从使用其他列的表达式中计算该列.使用集合运算符 UNION.UNION ALL.CROSSJOIN.EXC

SQL SERVER大话存储结构(2)

阅读目录(Content) 1 行记录如何存储 1.1 堆表 1.2 聚集索引表格 2 非聚集索引结构 3 非聚集索引键值内容 3.1 堆表上的非聚集索引 3.2 聚集索引表(唯一)的非聚集索引 3.3 聚集索引表(非唯一)的非聚集索引 4 非聚集索引如何查找页 如果转载,请注明博文来源: www.cnblogs.com/xinysu/   ,版权归 博客园 苏家小萝卜 所有.望各位支持! 本系列上一篇博文链接:SQL SERVER大话存储结构(1)_数据页类型及页面指令分析 回到顶部(go t

两张表格之间的筛选

今天帮我嫂子搞了一个筛选,记下 首先,两张表格,将半直接表中的人名从1--31表中查找筛选出来(人数较多) 在1--31.xls中选择一列写公式,=IFERROR(VLOOKUP(B1,[半直接.xls]Sheet1!$A:$A,1,FALSE),"") 回车,然后点小加号下拉,若有半直接表中的人名,则会在那一列显示出人名,否则为空白 最后,用一次筛选,去除空白就完成了. 原文地址:https://www.cnblogs.com/xinqimisa/p/12345381.html

sql语句中----删除表数据的"三兄弟"

说到删除表数据的关键字,大家记得最多的可能就是delete了 然而我们做数据库开发,读取数据库数据.对另外的两兄弟用得就比较少了 现在来介绍另外两个兄弟,都是删除表数据的,其实也是很容易理解的 老大------drop 出没场合:drop table  tb --tb表示数据表的名字,下同 绝招:删除内容和定义,释放空间.简单来说就是把整个表去掉.以后要新增数据是不可能的,除非新增一个表, 例如:一个班就是一个表,学生就是表中的数据,学生的职务就是定义 drop table class,就是把整