SQLSERVER中如何快速比较两张表的不一样
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]
UNION
SELECT *
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]
UNION
SELECT *
FROM [t1_old]
) AS T;
两表数据

查询出来的结果是4

方法三:EXCEPT 减法归零
SELECT COUNT(*)
FROM ( SELECT *
FROM [dbo].[t1_new]
EXCEPT
SELECT *
FROM [dbo].[t1_old]
) AS T; SELECT COUNT(*)
FROM ( SELECT *
FROM [dbo].[t1_old]
EXCEPT
SELECT *
FROM [dbo].[t1_new]
) AS T; SELECT * FROM [dbo].[t1_new] SELECT * FROM [dbo].[t1_old]

这里检测出来结果不对,那么就直接给出不一致的结论
方法四:用全表INNER JOIN,这个也是最烂的做法,当然这里指的是在表记录数超级多的情况下
DECLARE @t1_newcount BIGINT
DECLARE @count BIGINT SELECT @t1_newcount = COUNT(*)
FROM t1_new; SELECT @count = COUNT(*)
FROM [t1_old] AS a
INNER 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
ELSE
BEGIN
SELECT '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中如何快速比较两张表的不一样的更多相关文章
- 利用pymysql同时修改两张表的数据
使用pymysql操作数据库中相关联的两张表需求:两张表中分别有一个字段是json格式,需要往json中再插入一个属性值’container_cloud’=’fasle’. import pymysq ...
- SQLServer两张表筛选相同数据和不同数据
概述 项目中经常会对两张数据库表的数据进行比较,选出相同的数据或者不同的数据.在SQL SERVER 2000中只能用Exists来判断,到了SQL SERVER 2005以后可以采用EXCEPT和I ...
- EF Core中如何正确地设置两张表之间的关联关系
数据库 假设现在我们在SQL Server数据库中有下面两张表: Person表,代表的是一个人: CREATE TABLE [dbo].[Person]( ,) NOT NULL, ) NULL, ...
- 转 A 、B两张表,找出ID字段中,存在A表,但是不存在B表的数据
A.B两张表,找出ID字段中,存在A表,但是不存在B表的数据,A表总共13W数据,去重后大约3万条数据,B表有2W条数据,且B表的ID有索引. 方法一 使用not in,容易理解,效率低. selec ...
- CROSS JOIN连接用于生成两张表的笛卡尔集
将两张表的情况全部列举出来 结果表: 列= 原表列数相加 行= 原表行数相乘 CROSS JOIN连接用于生成两张表的笛卡尔集. 在sql中cross join的使用: 1.返回的记录数为两个 ...
- django同时查询两张表的数据,合并检索对象返回
原始需求: 1.一篇文章内容分N个版块,每篇文章的版块数量不同. 2.有个文章搜索功能,需要同时搜索标题和内容. 实现思路: 1.由于每篇文章的内容版块数量不同,因此将每个文章的标题和内容分开存入2张 ...
- 关于跨DB增量(增、改)同步两张表的数据小技巧
有些场景下,需要隔离不同的DB,彼此DB之间不能互相访问,但实际的业务场景又需要从A DB访问B DB的情形,这时怎么办?我认为有如下常规的三种方案: 1.双方提供RESET API,需要访问不同DB ...
- 【转载】C#代码开发过程中如何快速比较两个文件夹中的文件的异同
在日常的使用电脑的过程中,有时候我们需要比较两个文件夹,查找出两个文件夹中不同的文件以及文件中不同的内容信息,进行内容的校对以及合并等操作.其实使用Beyond Compare软件即可轻松比较,Bey ...
- mysql左连接右连接(查询两张表不同的数据)
有两张表:一张A表he一张B表 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 :right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录: ...
随机推荐
- IIS上虚拟目录下站点的web.config与根站点的web.config冲突解决方法
IIS7.5上在站点下部署虚拟目录,访问虚拟目录下的项目提示与父节点配置冲突.,节点与的<system.web>节点与主站点的<system.web>冲突解决方法: 在站点下的 ...
- 转:亿级Web系统的高容错性实践(好博文)
亿级Web系统的高容错性实践 亿级Web系统的高容错性实践 背景介绍 大概三年前,我在腾讯负责的活动运营系统,因为业务流量规模的数倍增长,系统出现了各种各样的异常,当时,作为开发的我,7*24小时地没 ...
- 记录一次自己对nginx+fastcgi(fpm)+mysql压力测试结果
nginx + fastcgi(fpm) 压力测试: CentOS release 5.9 16核12G内存 静态页面: 并发1000,压测200秒,测试结果: 系统最大负载5.47 成功响应: 25 ...
- 有向图强连通分量的Tarjan算法
有向图强连通分量的Tarjan算法 [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G ...
- [转]Centos7下caffe的安装
Centos7下caffe的安装 原文地址:http://blog.csdn.net/s2392735818/article/details/49796017 版权声明:本文为博主原创文章,未经博 ...
- [PHP] Xhprof 非侵入式使用指南
一般使用 Xhprof ,按文档操作可以快速上手,文件头开启 Xhprof,应用结束处得到访问的url查看. 这种使用方式可以快速看到效果,同时也有一些不好的地方: 一是不利于重复利用写好的示例代码: ...
- Jmeter学习
网址: http://www.ltesting.net/ceshi/open/kyxncsgj/jmeter/ http://www.cnblogs.com/TankXiao/p/4059378.ht ...
- IOS开发之网络图片处理
//图片压缩 UIImage* image=[UIImage imageWithData:data]; NSData *data1 = UIImageJPEGRepresentation(image, ...
- 纯jsp用户登录系统
用纯jsp技术实现用户登录系统,需要用到三个.jsp文件.在文本目录下新建三个.jsp文件,分别命名为login.jsp,logincl.jsp和wel.jsp. 1.login.jsp文件用来放界面 ...
- Runloop 深入理解(转)
RunLoop 是 iOS 和 OSX 开发中非常基础的一个概念,这篇文章将从 CFRunLoop 的源码入手,介绍 RunLoop 的概念以及底层实现原理.之后会介绍一下在 iOS 中,苹果是如何利 ...