问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

SQL语句:对比两张表的数据并筛选出数据不同的

发布网友 发布时间:2022-04-09 02:57

我来回答

2个回答

懂视网 时间:2022-04-09 07:18

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


第一步当然就是检查记录数是否一致,否则不用想其他方法了~
这里我们用两张表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中如何快速比较两张表的不一样

标签:

热心网友 时间:2022-04-09 04:26

SQL语句对比两张表的数据并筛选出数据不同的公式如下:

select A.* from A, B
where A.A1=B.B1 -- 相同主键,做表连接.


and A.A2 <> B.B2 -- 条件:A2不等于B2.


and A.A3 <> B.B3 -- 条件:A3不等于B3.

知识延展:

sql 语句是对数据库进行操作的一种语言。

结构化查询语言(Structured Query Language)简称SQL,结构化查询语言是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
是选诺顿杀毒软件好还是NOD32好? 诺顿好还是NOD32好???请高手指点 诺顿安全软件和ESET NOD32安全软件相比,谁的防护.杀毒更强,功能更多... 诺顿和NOD32这两个杀毒软件哪个比较好? 什么是土地二次抵押 "口似含莲,乾姜之手"是什么意思? 乾姜的意思是什么 都说Pinnacle Food公司各方面做的好,有对这家了解的吗 空调蒸发箱多久清洗一次 空调蒸发箱需要清洗吗 苹果xr流量设置 大家都用智能手机干什么? 大家平时用手机上网都干些什么? 平时大家都用手机来干什么? 你们用手机主要干什么 大学生到底都用智能手机做什么? 企业浙里办名称和营业执照上的名称不一样怎么办 杭州市富阳区个体营业执照如何新增人员办理社保? 一般你们都在手机上干嘛,除了打游戏、看抖音? 我国手机上网人数达9.86亿,你玩手机一般都在干什么? 办营业执照的问题 你们用手机都是用来干什么,觉得玩多了好无聊 富阳区的公司变更英文名称到哪个部门办理? 富阳区申请劳务队执照需提供哪些资料 我想把衢州的营业执照迁回富阳,需要什么资料?哪里去办理 富阳万市镇棋牌室有几许无营业执照,派出所民警应一小家家的调查询。 我的浙江富阳的 想问下 现在声请网吧营业执照要多少钱 心理健康增强自信的方法 1如何帮助学生增强自信心?——心理健康教育C证面试活动课构思与设计 天通苑本区装修及暖气改造问题 装修是施工流程是什么及工程验收 高中应该用手机吗?你们一般用手机来干什么 我国手机上网人数达9.86亿,他们平时上网都在做什么? 你们闲的时候都在用手机干什么? 大家用智能手机都做什么呢? 张耘的科研项目 光束稳定化装置是什么? 激光光束稳定化装置是什么? 量子通信可以做到真正的无人值守? 请问高手们:什么是材料的铁电性及铁磁性? 急需!~~冯端的简介!悬赏高分!~~~ 有什么去淤青的好方法? 凭江南style火遍全球的鸟叔,现在怎么被称为韩国陈志朋? 2012mama颁奖典礼鸟叔跳舞时候视频里面出现的四个女明星!是什么组合?最右边那个叫什么? 12月31日湖南卫视鸟叔跳江南style的视频 鸟叔 江南style 的视频 秒拍女的穿白色裤子跳鸟叔舞蹈视频 求一段鸟叔江南styleMV的骑马舞那段视频,跪谢 老房子装修的技巧有哪些? 靠一首歌红遍全球、跳“骑马舞”的鸟叔,现在如何了? MVMV和鸟叔跳舞的美女是谁呀