数码资讯
SQLServer中如何比较两个表的数据说明
开始 一会儿,我们遇到了这样一个SQL查询要求的项目中,有两个结构相同的表(table_left table_right),如下: 图1。 每个组检查(GroupID)表table_left,以及是否存在一组(GroupID)数据(数据)表table_right(数据)是完全一样的数据(数据)。 你
选购提示
关注价格、性能、续航、售后和真实使用场景,理性比较后再下单。
开始
一会儿,我们遇到了这样一个SQL查询要求的项目中,有两个结构相同的表(table_left table_right),如下:
图1。
每个组检查(GroupID)表table_left,以及是否存在一组(GroupID)数据(数据)表table_right(数据)是完全一样的数据(数据)。
你可以看到在图1中,有两套在表table_left和table_right是完全相同的数据:
图2。
分析
从上面的两个表中,我们可以知道它们存储了一组数据。然后,用枚举法和数学运算进行分析。
一组枚举用于描述两个表中的每一个数据。
图3。
只有两种情况,相等和不相等。对于不相等,可以分为部分相等、包含和完全不相等。使用集合描述,可以使用交集的一个子集,如图4所示。下面,我列举这些常见的案例:
图4。
实现
在数据库中,也有很多的方法来找到一组具有相同的数据表table_left和表table_right,这里我列出了最常用的两种方法。
(下面的SQL脚本是基于图4的数据)。
方法1:
通过…………选择………………的XML路径(')每个数据列数据绑定(如图4)。列中的数据绑定到data1-data2-data3table_left的# 11组),另一组(表table_right)此方法实现数据列的数据序列;然后通过两表进行比较,一系列领域存在平等,这意味着,如果数据相同的两套是平等的,可确定这套表table_right及其数据完全相等的组数据table_left表。
方法1,你需要添加一个字段的数据通路到原始表中存储的数据列的数据系列,结果如:复制代码代码如下:
修改表添加数据通路table_left nvarchar(200)
修改表添加数据通路table_right nvarchar(200)
集团的一系列数据列的数据更新到新添加的列的数据通路,如:复制代码代码如下:
更新
设置数据通路= b.datapath
从table_left一
交叉应用(选择(选择-+ x.data从table_left X在x.groupid = a.groupid顺序))
更新
设置数据通路= b.datapath
从table_right一
交叉应用(选择(选择-+ x.data从table_right X在x.groupid = a.groupid顺序))
接下来是查询,例如:复制代码代码如下所示:
选择不同的a.groupid
从table_left一
在存在(选择1 table_right X在x.datapath = a.datapath)
完整代码:复制代码如下所示:
查看代码
使用tempdb
去
如果object_id('table_left)不为空表table_left
如果object_id('table_right)不为空表table_right
去
创建表table_left(GroupID nvarchar(5),数据nvarchar(10))
创建表table_right(GroupID nvarchar(5),数据nvarchar(10))
去
修改表添加数据通路table_left nvarchar(200)
修改表添加数据通路table_right nvarchar(200)
去
创建非聚集索引ix_left table_left(通路)
创建非聚集索引ix_right table_right(通路)
去
Set NOCOUNT on
去
插入table_right(GroupID,数据)
选择# 1,'data1工会所有
选择# 1,'data2工会所有
选择# 1,'data3工会所有
选择# 2,'data55工会所有
选择# 2,'data55工会所有
选择# 3,'data91工会所有
选择# 3,'data92工会所有
选择# 4,'data65工会所有
选择# 4,'data66工会所有
选择# 4,'data67工会所有
选择# 4,'data68工会所有
选择# 4,'data69工会所有
选择# 5,'data77工会所有
选择# 5,'data79
插入table_left(GroupID,数据)
选择# 11,'data1工会所有
选择# 11,'data2工会所有
选择# 11,'data3工会所有
选择# 22,'data55工会所有
选择# 22,'data57工会所有
选择# 33,'data99工会所有
选择# 33,'data99工会所有
选择# 44,'data66工会所有
选择# 44,'data68工会所有
选择# 55,'data77工会所有
选择# 55,'data78工会所有
选择# 55,'data79
去
更新
设置数据通路= b.datapath
从table_left一
交叉应用(选择(选择-+ x.data从table_left X在x.groupid = a.groupid顺序))
更新
设置数据通路= b.datapath
从table_right一
交叉应用(选择(选择-+ x.data从table_right X在x.groupid = a.groupid顺序))
—
选择不同的a.groupid
从table_left一
在存在(选择1 table_right X在x.datapath = a.datapath)
方法2:
通过设置操作员除提供的SQL Sever,两组非重复数据进行判断,如果两组没有非重复数据给对方,表明两组数据是完全平等的。例如,在表table_left和表table_right组11组# # 1数据,除了操作栏,这是(# 11,# 1)除了设置操作(# 1,# 11)或除操作,返回一个空的结果,表明该数据集# 1和# 11完全相同,如:复制代码如下:
选择数据从哪里table_left GroupID =# 11'except选择数据table_right哪里
选择数据从哪里table_right GroupID =# 1'except选择数据table_left哪里
以同样的方式,我们用11组#表table_right表table_left和集团# 2执行除了集合运算的列的数据,例如:复制代码代码如下:
选择数据从哪里table_left GroupID =# 11'except选择数据table_right哪里
选择数据从哪里table_right GroupID =# 2'except选择数据table_left哪里
只要(# 11,# 2)或(2 # #,11)的除创下的纪录,两组数据不相等。
将两个表的所有组进行比较,我们需要实现以下SQL脚本,如:复制代码如下所示:
选择不同的a.groupid
从table_left一
内部联接table_right B b.data = a.data
在不存在(选择X X,table_left x.groupid = a.groupid除了选择数据)
不存在(选择X X,table_right x.groupid = b.groupid除了选择数据)
完整代码:复制代码如下所示:
查看代码
使用tempdb
去
如果object_id('table_left)不为空表table_left
如果object_id('table_right)不为空表table_right
去
创建表table_left(GroupID nvarchar(5),数据nvarchar(10))
创建表table_right(GroupID nvarchar(5),数据nvarchar(10))
去
创建非聚集索引ix_left table_left(数据)
创建非聚集索引ix_right table_right(数据)
去
SET NOCOUNT ON
去
插入table_right(GroupID,数据)
选择# 1,'data1工会所有
选择# 1,'data2工会所有
选择# 1,'data3工会所有
选择# 2,'data55工会所有
选择# 2,'data55工会所有
选择# 3,'data91工会所有
选择# 3,'data92工会所有
选择# 4,'data65工会所有
选择# 4,'data66工会所有
选择# 4,'data67工会所有
选择# 4,'data68工会所有
选择# 4,'data69工会所有
选择# 5,'data77工会所有
选择# 5,'data79
插入table_left(GroupID,数据)
选择# 11,'data1工会所有
选择# 11,'data2工会所有
选择# 11,'data3工会所有
选择# 22,'data55工会所有
选择# 22,'data57工会所有
选择# 33,'data99工会所有
选择# 33,'data99工会所有
选择# 44,'data66工会所有
选择# 44,'data68工会所有
选择# 55,'data77工会所有
选择# 55,'data78工会所有
选择# 55,'data79
去
——选择
选择不同的a.groupid
从table_left一
内部联接table_right B b.data = a.data
在不存在(选择X X,table_left x.groupid = a.groupid除了选择数据)
不存在(选择X X,table_right x.groupid = b.groupid除了选择数据)
方法1 vs方法2:
方法1和方法2找到组# 11是完全相同的数据表的table_left在table_right.but业绩来看,2种方法比方法1可以以上行程执行的过程中看到他们,统计信息:
方法1:
图5。
方法2:
图6。
如果数据量很大,那么方法2具有更明显的优势比方法1。因为1的数据通路,两部分更新,数据量的增加,位置更新这里的很多资源的消耗;如果数据列的数据大小超过900字节,将导致指数不能在数据通路创建,在选择查询性能的影响。
延伸
这里是延伸,主要针对以上方法2。当列中的数据的数据大小超过900字节,或者如果有多个数据列,我们需要比较两列(GroupID)。
图7。
在这种情况下,散列索引可以为现场datasub1 datasub2,创造了如:复制代码代码如下:
修改表table_left添加datachecksum作为校验和(datasub1,datasub2)
修改表table_right添加datachecksum作为校验和(datasub1,datasub2)
去
创建非聚集索引ix_table_left_cs在table_right(datachecksum)
创建非聚集索引table_right_cs在table_right(datachecksum)
下面的SELECT语句可以在内部连接部分稍微更改,例如:复制代码如下所示:
选择不同的a.groupid
从table_left一
内部联接table_right B b.datachecksum = a.datachecksum
和b.datasub1 = a.datasub1
和b.datasub2 = a.datasub2
在不存在(选择x.datasub1,x.datasub2从table_left X在x.groupid = a.groupid,哪里,x.datasub2)。
不存在(选择x.datasub1,x.datasub2从table_right X在x.groupid = b.groupid,哪里,x.datasub2)。
完整代码:复制代码如下所示:
查看代码
使用tempdb
去
如果object_id('table_left)不为空表table_left
如果object_id('table_right)不为空表table_right
去
创建表table_left(GroupID nvarchar(5),datasub1 nvarchar(10),datasub2 nvarchar(10))
创建表table_right(GroupID nvarchar(5),datasub1 nvarchar(10),datasub2 nvarchar(10))
去
修改表table_left添加datachecksum作为校验和(datasub1,datasub2)
修改表table_right添加datachecksum作为校验和(datasub1,datasub2)
去
创建非聚集索引ix_table_left_cs在table_left(datachecksum)
创建非聚集索引table_right_cs在table_right(datachecksum)
去
SET NOCOUNT ON
去
插入table_right(GroupID,datasub1,datasub2)
选择# 1,'data1 ','data7'union所有
选择# 1,'data2 ','data8'union所有
选择# 1,'data3 ','data9'union所有
选择# 2,'data55 ','data4'union所有
选择# 2,'data55 ','data5
插入table_left(GroupID,datasub1,datasub2)
选择# 11,'data1 ','data7'union所有
选择# 11,'data2 ','data8'union所有
选择# 11,'data3 ','data9'union所有
选择# 22,'data55 ','data0'union所有
选择# 22,'data57 ','data2'union所有
选择# 33,'data99 ','data4'union所有
选择# 33,'data99 ','data6
去
——选择
选择不同的a.groupid
从table_left一
内部联接table_right B b.datachecksum = a.datachecksum
和b.datasub1 = a.datasub1
和b.datasub2 = a.datasub2
在不存在(选择x.datasub1,x.datasub2从table_left X在x.groupid = a.groupid,哪里,x.datasub2)。
不存在(选择x.datasub1,x.datasub2从table_right X在x.groupid = b.groupid,哪里,x.datasub2)。
总结
也许还有其他更好的办法来解决这个问题。此外,实际生产环境可能有不同的情况。无论如何,我们需要更多的分析,更多的实验和更多的实验来找到最好的解决方案。
一会儿,我们遇到了这样一个SQL查询要求的项目中,有两个结构相同的表(table_left table_right),如下:
图1。
每个组检查(GroupID)表table_left,以及是否存在一组(GroupID)数据(数据)表table_right(数据)是完全一样的数据(数据)。
你可以看到在图1中,有两套在表table_left和table_right是完全相同的数据:
图2。
分析
从上面的两个表中,我们可以知道它们存储了一组数据。然后,用枚举法和数学运算进行分析。
一组枚举用于描述两个表中的每一个数据。
图3。
只有两种情况,相等和不相等。对于不相等,可以分为部分相等、包含和完全不相等。使用集合描述,可以使用交集的一个子集,如图4所示。下面,我列举这些常见的案例:
图4。
实现
在数据库中,也有很多的方法来找到一组具有相同的数据表table_left和表table_right,这里我列出了最常用的两种方法。
(下面的SQL脚本是基于图4的数据)。
方法1:
通过…………选择………………的XML路径(')每个数据列数据绑定(如图4)。列中的数据绑定到data1-data2-data3table_left的# 11组),另一组(表table_right)此方法实现数据列的数据序列;然后通过两表进行比较,一系列领域存在平等,这意味着,如果数据相同的两套是平等的,可确定这套表table_right及其数据完全相等的组数据table_left表。
方法1,你需要添加一个字段的数据通路到原始表中存储的数据列的数据系列,结果如:复制代码代码如下:
修改表添加数据通路table_left nvarchar(200)
修改表添加数据通路table_right nvarchar(200)
集团的一系列数据列的数据更新到新添加的列的数据通路,如:复制代码代码如下:
更新
设置数据通路= b.datapath
从table_left一
交叉应用(选择(选择-+ x.data从table_left X在x.groupid = a.groupid顺序))
更新
设置数据通路= b.datapath
从table_right一
交叉应用(选择(选择-+ x.data从table_right X在x.groupid = a.groupid顺序))
接下来是查询,例如:复制代码代码如下所示:
选择不同的a.groupid
从table_left一
在存在(选择1 table_right X在x.datapath = a.datapath)
完整代码:复制代码如下所示:
查看代码
使用tempdb
去
如果object_id('table_left)不为空表table_left
如果object_id('table_right)不为空表table_right
去
创建表table_left(GroupID nvarchar(5),数据nvarchar(10))
创建表table_right(GroupID nvarchar(5),数据nvarchar(10))
去
修改表添加数据通路table_left nvarchar(200)
修改表添加数据通路table_right nvarchar(200)
去
创建非聚集索引ix_left table_left(通路)
创建非聚集索引ix_right table_right(通路)
去
Set NOCOUNT on
去
插入table_right(GroupID,数据)
选择# 1,'data1工会所有
选择# 1,'data2工会所有
选择# 1,'data3工会所有
选择# 2,'data55工会所有
选择# 2,'data55工会所有
选择# 3,'data91工会所有
选择# 3,'data92工会所有
选择# 4,'data65工会所有
选择# 4,'data66工会所有
选择# 4,'data67工会所有
选择# 4,'data68工会所有
选择# 4,'data69工会所有
选择# 5,'data77工会所有
选择# 5,'data79
插入table_left(GroupID,数据)
选择# 11,'data1工会所有
选择# 11,'data2工会所有
选择# 11,'data3工会所有
选择# 22,'data55工会所有
选择# 22,'data57工会所有
选择# 33,'data99工会所有
选择# 33,'data99工会所有
选择# 44,'data66工会所有
选择# 44,'data68工会所有
选择# 55,'data77工会所有
选择# 55,'data78工会所有
选择# 55,'data79
去
更新
设置数据通路= b.datapath
从table_left一
交叉应用(选择(选择-+ x.data从table_left X在x.groupid = a.groupid顺序))
更新
设置数据通路= b.datapath
从table_right一
交叉应用(选择(选择-+ x.data从table_right X在x.groupid = a.groupid顺序))
—
选择不同的a.groupid
从table_left一
在存在(选择1 table_right X在x.datapath = a.datapath)
方法2:
通过设置操作员除提供的SQL Sever,两组非重复数据进行判断,如果两组没有非重复数据给对方,表明两组数据是完全平等的。例如,在表table_left和表table_right组11组# # 1数据,除了操作栏,这是(# 11,# 1)除了设置操作(# 1,# 11)或除操作,返回一个空的结果,表明该数据集# 1和# 11完全相同,如:复制代码如下:
选择数据从哪里table_left GroupID =# 11'except选择数据table_right哪里
选择数据从哪里table_right GroupID =# 1'except选择数据table_left哪里
以同样的方式,我们用11组#表table_right表table_left和集团# 2执行除了集合运算的列的数据,例如:复制代码代码如下:
选择数据从哪里table_left GroupID =# 11'except选择数据table_right哪里
选择数据从哪里table_right GroupID =# 2'except选择数据table_left哪里
只要(# 11,# 2)或(2 # #,11)的除创下的纪录,两组数据不相等。
将两个表的所有组进行比较,我们需要实现以下SQL脚本,如:复制代码如下所示:
选择不同的a.groupid
从table_left一
内部联接table_right B b.data = a.data
在不存在(选择X X,table_left x.groupid = a.groupid除了选择数据)
不存在(选择X X,table_right x.groupid = b.groupid除了选择数据)
完整代码:复制代码如下所示:
查看代码
使用tempdb
去
如果object_id('table_left)不为空表table_left
如果object_id('table_right)不为空表table_right
去
创建表table_left(GroupID nvarchar(5),数据nvarchar(10))
创建表table_right(GroupID nvarchar(5),数据nvarchar(10))
去
创建非聚集索引ix_left table_left(数据)
创建非聚集索引ix_right table_right(数据)
去
SET NOCOUNT ON
去
插入table_right(GroupID,数据)
选择# 1,'data1工会所有
选择# 1,'data2工会所有
选择# 1,'data3工会所有
选择# 2,'data55工会所有
选择# 2,'data55工会所有
选择# 3,'data91工会所有
选择# 3,'data92工会所有
选择# 4,'data65工会所有
选择# 4,'data66工会所有
选择# 4,'data67工会所有
选择# 4,'data68工会所有
选择# 4,'data69工会所有
选择# 5,'data77工会所有
选择# 5,'data79
插入table_left(GroupID,数据)
选择# 11,'data1工会所有
选择# 11,'data2工会所有
选择# 11,'data3工会所有
选择# 22,'data55工会所有
选择# 22,'data57工会所有
选择# 33,'data99工会所有
选择# 33,'data99工会所有
选择# 44,'data66工会所有
选择# 44,'data68工会所有
选择# 55,'data77工会所有
选择# 55,'data78工会所有
选择# 55,'data79
去
——选择
选择不同的a.groupid
从table_left一
内部联接table_right B b.data = a.data
在不存在(选择X X,table_left x.groupid = a.groupid除了选择数据)
不存在(选择X X,table_right x.groupid = b.groupid除了选择数据)
方法1 vs方法2:
方法1和方法2找到组# 11是完全相同的数据表的table_left在table_right.but业绩来看,2种方法比方法1可以以上行程执行的过程中看到他们,统计信息:
方法1:
图5。
方法2:
图6。
如果数据量很大,那么方法2具有更明显的优势比方法1。因为1的数据通路,两部分更新,数据量的增加,位置更新这里的很多资源的消耗;如果数据列的数据大小超过900字节,将导致指数不能在数据通路创建,在选择查询性能的影响。
延伸
这里是延伸,主要针对以上方法2。当列中的数据的数据大小超过900字节,或者如果有多个数据列,我们需要比较两列(GroupID)。
图7。
在这种情况下,散列索引可以为现场datasub1 datasub2,创造了如:复制代码代码如下:
修改表table_left添加datachecksum作为校验和(datasub1,datasub2)
修改表table_right添加datachecksum作为校验和(datasub1,datasub2)
去
创建非聚集索引ix_table_left_cs在table_right(datachecksum)
创建非聚集索引table_right_cs在table_right(datachecksum)
下面的SELECT语句可以在内部连接部分稍微更改,例如:复制代码如下所示:
选择不同的a.groupid
从table_left一
内部联接table_right B b.datachecksum = a.datachecksum
和b.datasub1 = a.datasub1
和b.datasub2 = a.datasub2
在不存在(选择x.datasub1,x.datasub2从table_left X在x.groupid = a.groupid,哪里,x.datasub2)。
不存在(选择x.datasub1,x.datasub2从table_right X在x.groupid = b.groupid,哪里,x.datasub2)。
完整代码:复制代码如下所示:
查看代码
使用tempdb
去
如果object_id('table_left)不为空表table_left
如果object_id('table_right)不为空表table_right
去
创建表table_left(GroupID nvarchar(5),datasub1 nvarchar(10),datasub2 nvarchar(10))
创建表table_right(GroupID nvarchar(5),datasub1 nvarchar(10),datasub2 nvarchar(10))
去
修改表table_left添加datachecksum作为校验和(datasub1,datasub2)
修改表table_right添加datachecksum作为校验和(datasub1,datasub2)
去
创建非聚集索引ix_table_left_cs在table_left(datachecksum)
创建非聚集索引table_right_cs在table_right(datachecksum)
去
SET NOCOUNT ON
去
插入table_right(GroupID,datasub1,datasub2)
选择# 1,'data1 ','data7'union所有
选择# 1,'data2 ','data8'union所有
选择# 1,'data3 ','data9'union所有
选择# 2,'data55 ','data4'union所有
选择# 2,'data55 ','data5
插入table_left(GroupID,datasub1,datasub2)
选择# 11,'data1 ','data7'union所有
选择# 11,'data2 ','data8'union所有
选择# 11,'data3 ','data9'union所有
选择# 22,'data55 ','data0'union所有
选择# 22,'data57 ','data2'union所有
选择# 33,'data99 ','data4'union所有
选择# 33,'data99 ','data6
去
——选择
选择不同的a.groupid
从table_left一
内部联接table_right B b.datachecksum = a.datachecksum
和b.datasub1 = a.datasub1
和b.datasub2 = a.datasub2
在不存在(选择x.datasub1,x.datasub2从table_left X在x.groupid = a.groupid,哪里,x.datasub2)。
不存在(选择x.datasub1,x.datasub2从table_right X在x.groupid = b.groupid,哪里,x.datasub2)。
总结
也许还有其他更好的办法来解决这个问题。此外,实际生产环境可能有不同的情况。无论如何,我们需要更多的分析,更多的实验和更多的实验来找到最好的解决方案。
声明:本文内容用于数码产品信息整理与选购参考,具体价格、库存、售后政策以官方渠道和电商页面实时信息为准。