国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開發(fā) > 綜合 > 正文

SQLSERVER中如何快速比較兩張表的不一樣

2024-07-21 02:48:14
字體:
供稿:網(wǎng)友
SQLSERVER中如何快速比較兩張表的不一樣SQLSERVER中如何快速比較兩張表的不一樣

不知不覺要寫2014年的最后一篇博文了~

一般來說,如何檢測(cè)兩張表的內(nèi)容是否一致,體現(xiàn)在復(fù)制的時(shí)候發(fā)布端和訂閱端的兩端的數(shù)據(jù)上面

我這里羅列了一些如何從數(shù)據(jù)庫(kù)層面來解決此類問題的方法

第一步當(dāng)然就是檢查記錄數(shù)是否一致,否則不用想其他方法了~這里我們用兩張表t1_old,t1_new來演示


方法介紹

方法一:老老實(shí)實(shí)看表結(jié)構(gòu)和表記錄數(shù),弊端是根本看不到兩張表的數(shù)據(jù)是否一致,只是看到表結(jié)構(gòu)和記錄數(shù)是否一致

--表結(jié)構(gòu): CREATE TABLE t1_old (  id int NOT NULL,  log_time DATETIME DEFAULT '') ; CREATE TABLE t1_new (  id int NOT NULL,  log_time DATETIME DEFAULT '') ;--兩表的記錄數(shù)都為100條。select count(*) from t1_old;select count(*) from t1_new;

方法二:加法去重 union 運(yùn)算符排除重復(fù)的,但是有bug,在某些情形下不能簡(jiǎn)單表示結(jié)果集一致,相當(dāng)于無效

由于Union 本身具備把上下兩條連接的記錄做唯一性排序,所以這樣檢測(cè)起來比較簡(jiǎn)單

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;

兩表數(shù)據(jù)

查詢出來的結(jié)果是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]

這里檢測(cè)出來結(jié)果不對(duì),那么就直接給出不一致的結(jié)論

方法四:用全表INNER JOIN,這個(gè)也是最爛的做法,當(dāng)然這里指的是在表記錄數(shù)超級(jí)多的情況下

DECLARE @t1_newcount BIGINTDECLARE @count BIGINTSELECT  @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 @countPRINT @t1_newcountIF ( @count = @t1_newcount )    BEGIN         SELECT  'equal'    END ELSE    BEGIN        SELECT  'not equal'    END 

方法五:借助SQLSERVER自帶的tablediff工具,當(dāng)初微軟制作這個(gè)工具的目的就是用于比較復(fù)制中發(fā)布表和訂閱表的數(shù)據(jù)一致

identical是相等的意思

方法六:借助發(fā)布端的驗(yàn)證訂閱功能,驗(yàn)證訂閱端跟發(fā)布端的數(shù)據(jù)是否一致

方法七:用checksum校驗(yàn),比較兩張表里的內(nèi)容的checksum值是否一致

但是這種方法也只局限于兩表結(jié)構(gòu)一摸一樣

我把[t1_new]表的數(shù)據(jù)復(fù)制到一張新的表以便進(jìn)行比較

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]


總結(jié)

從上面幾種數(shù)據(jù)庫(kù)提供的方法來看,用EXCEPT減法來歸零相對(duì)來說比較可靠,其他的方法比較適合在特定的情形下來檢測(cè)

如有不對(duì)的地方,歡迎大家拍磚o(∩_∩)o


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 罗江县| 德清县| 德兴市| 竹北市| 襄汾县| 厦门市| 秦安县| 肇东市| 故城县| 青阳县| 望城县| 开鲁县| 望城县| 于都县| 且末县| 土默特左旗| 临湘市| 高邮市| 威信县| 庆元县| 江油市| 宝鸡市| 霸州市| 新晃| 深圳市| 马关县| 郯城县| 舒兰市| 庆城县| 东方市| 潍坊市| 隆子县| 柘荣县| 新源县| 静乐县| 襄垣县| 东乡族自治县| 枣庄市| 六盘水市| 容城县| 汤原县|