SQLSERVER中如何快速比较两张表的不一样

不知不觉要写2014年的最后一篇博文了~

一般来说,如何检测两张表的内容是否一致,体现在复制的时候发布端和订阅端的两端的数据上面

我这里罗列了一些如何从数据库层面来解决此类问题的方法

第一步当然就是检查记录数是否一致,否则不用想其他方法了~
这里我们用两张表t1_old,t1_new来演示


方法介绍

方法一:老老实实看表结构和表记录数,弊端是根本看不到两张表的数据是否一致,只是看到表结构和记录数是否一致

--表结构:CREATE TABLE t1_old (id int NOT NULL,log_time DATETIME DEFAULT ''
) ;CREATE TABLE t1_new (id int NOT NULL,log_time DATETIME DEFAULT ''
) ;--两表的记录数都为100条。
select count(*) from t1_old;select count(*) from t1_new;

方法二:加法去重 union 运算符排除重复的,但是有bug,在某些情形下不能简单表示结果集一致,相当于无效

由于Union 本身具备把上下两条连接的记录做唯一性排序,所以这样检测起来比较简单

SELECT  COUNT(*)
FROM    ( SELECT    *FROM      [t1_old]UNIONSELECT    *FROM      [t1_new]) AS T;INSERT INTO [dbo].[t1_new]( [id],[log_time] )
VALUES(1,''),(3,''),(4,'')INSERT INTO [dbo].[t1_old]( [id],[log_time] )
VALUES(1,''),(2,''),(3,'')SELECT * FROM [dbo].[t1_new]
SELECT * FROM [dbo].[t1_old]SELECT  COUNT(*)
FROM    ( SELECT    *FROM      [t1_new]UNIONSELECT    *FROM      [t1_old]) AS T;

两表数据

查询出来的结果是4

方法三:EXCEPT  减法归零

SELECT  COUNT(*)
FROM    ( SELECT    *FROM      [dbo].[t1_new]EXCEPTSELECT    *FROM      [dbo].[t1_old]) AS T;SELECT  COUNT(*)
FROM    ( SELECT    *FROM      [dbo].[t1_old]EXCEPTSELECT    *FROM      [dbo].[t1_new]) AS T;SELECT * FROM [dbo].[t1_new]SELECT * FROM [dbo].[t1_old]

这里检测出来结果不对,那么就直接给出不一致的结论

方法四:用全表INNER JOIN,这个也是最烂的做法,当然这里指的是在表记录数超级多的情况下

DECLARE @t1_newcount BIGINT
DECLARE @count BIGINTSELECT  @t1_newcount = COUNT(*)
FROM    t1_new;SELECT  @count = COUNT(*)
FROM    [t1_old] AS aINNER JOIN [t1_new] AS b ON [b].[id] = [a].[id]AND [b].[log_time] = [a].[log_time] --如果表中还有其他字段的自行添加
PRINT @count
PRINT @t1_newcount
IF ( @count = @t1_newcount )BEGIN SELECT  'equal'END
ELSEBEGINSELECT  'not equal'END 

方法五:借助SQLSERVER自带的tablediff工具,当初微软制作这个工具的目的就是用于比较复制中发布表和订阅表的数据一致

identical是相等的意思

方法六:借助发布端的验证订阅功能,验证订阅端跟发布端的数据是否一致

方法七:用checksum校验,比较两张表里的内容的checksum值是否一致

但是这种方法也只局限于两表结构一摸一样

我把[t1_new]表的数据复制到一张新的表以便进行比较

SELECT * FROM [dbo].[t1_new]
SELECT * FROM [dbo].[t1_newreplica]SELECT SUM(CHECKSUM(*)) AS checksumvalue FROM [dbo].[t1_old]
SELECT SUM(CHECKSUM(*)) AS checksumvalue FROM [dbo].[t1_new]
SELECT SUM(CHECKSUM(*)) AS checksumvalue FROM [dbo].[t1_newreplica]


总结

从上面几种数据库提供的方法来看,用EXCEPT减法来归零相对来说比较可靠,其他的方法比较适合在特定的情形下来检测

如有不对的地方,欢迎大家拍砖o(∩_∩)o 

本文版权归作者所有,未经作者同意不得转载。

SQLSERVER中如何快速比较两张表的不一样相关推荐

  1. 在Excel表格中如何快速检查两张表的不一样的数据

    在Excel表格中如何快速检查两张表的不一样的数据 目录 在Excel表格中如何快速检查两张表的不一样的数据 1.全选第一张表格,找到"开始"选项卡中"条件格式" ...

  2. sql 两张表的相同字段中刷选出不同数据

    我们在业务逻辑中,经常会涉及两张表之间的数据比较, 其中涉及到某张表中独一份的数据,如下 1 两张表中相同字段name , 查询出在表a存在而表b中不存在的数据,并去重 方法一: SELECT DIS ...

  3. access如何查询两张表的内容_Access使用技术2:使用交叉表查询向导进行每日汇总...

    个人主页:http://office-access.cn 公众号:DataMapHuanyu Access使用技术2:使用交叉表查询向导进行每日汇总 Access交叉表查询可以合并每日的量,日汇总功能 ...

  4. 快速对比两张工作表数据差异——《超级处理器》应用

    如何快速对比两个工作表数据差异?比如,有下面两张表,一张是审核前的,一张是审核后的,怎么快速找出两张表中不同的单元格. 生产报表审核后 生产报表审核前 我们很难一眼看出两个表的差异,我们用超级处理器来 ...

  5. SqlServer+mysql查询两张表的相同和不同数据

    sqlserver 在SQL SERVER 2000中只能用Exists来判断,到了SQL SERVER 2005以后可以采用EXCEPT和INTERSECT运算符比较两张表的数据. INTERSEC ...

  6. mysql查询两张表的同一列_如何快速查找两个数据表之间的相同和不同?

    原标题:如何快速查找两个数据表之间的相同和不同? 知识 随笔 案例 声音 其他 编者按 工作中经常会遇到对来源不同的数据进行比对,查找相同.不同.差异性等.过于复杂的需求,我们通常会转换思路,使用数据 ...

  7. 如何在JAVA编程语言程序开发中更好的利用数据库中2两张表?

    数据库中2两张表 一张user表,一张pay表 department的外键在user表中做主键 则:用eclipse的自动翻转工具生成的配置文件如下 <?xml version="1. ...

  8. MySQL中对比两张表是否有不同数据

    1.使用union all关联两张表,完事使用临时表或者说派生表的方式来进行数据对比. SELECT t1.pk, t1.c1 FROM t1 UNION ALL SELECT t2.pk, t2.c ...

  9. sqlserver如何把两张表的数据合并为一张表

    今天在公司做项目的时候遇到一个情况,有两张临时表A(inco varchar(50)).表B(qty varchar(50)) 需要将这个两个表的数据插入到一张临时表中C(inco varchar(5 ...

最新文章

  1. 人名翻译_考研英语翻译:句子中出现人名怎么办?
  2. 博为峰JavaEE技术文章 ——MyBatis 注解
  3. ABAP程序:查找TC相关的出口。
  4. Linux 和 Windows 平台不同的 UCS-2 编码
  5. caffeine 缓存_使用Caffeine和Spring Boot的多个缓存配置
  6. Node.js 从门详解 (二)
  7. 编译原理 - SLR(1)
  8. throw和throws有什么区别
  9. linux中移动光标的命令,linux命令行中常用光标移动快捷键
  10. 团队-象棋游戏-开发环境搭建过程
  11. android x86 精简版,逆天!Windows7终极纯净版x86,仅239MB | 殁漂遥
  12. 建行u盾弹不出来_建行网银不自动跳出网页 建行u盾不能弹出快捷登录
  13. 微软苏州校招笔试 12月27日
  14. 多伦多大学计算机ib成绩要求,IB学生要考多少分才能进入世界一流名校就读?这里有份IB要求一览表请收好!...
  15. vnpy框架的策略开发和回测逻辑详解---以螺纹钢主力合约的R-breaker日内策略为例
  16. Python能用来做什么?以下是Python的三大主要用途
  17. 决策树剪枝算法:REP/PEP/CCP算法
  18. 使用Navicat 连接linux系统中的mysql
  19. 搭乘地铁|轻轨规律(^-^) [大三四八九月实习]
  20. [编程题] 有趣的数字

热门文章

  1. 苹果被拒的血泪史。。。(update 2015.11)
  2. 汇编3-返回以及优化
  3. linux centos 系统php支持jpeg的安装方法
  4. C# 怎样判断 datagridview 中的checkbox列是否被选中
  5. Ubuntu学习日记--Lesson4:环境变量详解
  6. Linux常见问题三则:Executable Path Is Not Absolute
  7. 计算机缺失esul.dll,msedgeupdateres_es.dll
  8. java mysql查询试题_2016年Java认证考试题
  9. 地线与接地螺丝_28个配电接地的基本要求,最容易忽略的往往是最重要的
  10. pycharm背景图片的设置