如何验证两个查询是不是包含完全相同的数据

Posted

技术标签:

【中文标题】如何验证两个查询是不是包含完全相同的数据【英文标题】:How to verify if two queries contain exact same data如何验证两个查询是否包含完全相同的数据 【发布时间】:2015-09-02 17:17:58 【问题描述】:

我有一个表,它维护着一组“黄金标准”数据,如果该表得到正确处理,另一个表应该匹配这些数据。

这两个表都有近 1,000,000 条数据记录。

例如。我有具有 PrimaryKey1、ColumnA、ColumnB、ColumnC、ColumnD 和 Column E 的表 (table1)。

我有另一个表 (table2),其中包含 ForeignKey1、ColumnF、ColumnG、ColumnH、ColumnI、ColumnJ。

我需要检查这两个表中的所有数据是否完全相同,除了少数列。

我的意思是,table1 中的 ColumnA 必须与 table2 中的 columnF 完全相同,并且 table1 中的 ColumnC 必须与 table2 中的 ColumnI 匹配以获取相同的记录(我们称之为 primaryKey1)。表中的其他列无关紧要。

另外,如果数据集之间不匹配,我需要知道不匹配的位置。

【问题讨论】:

mssqltips.com/sqlservertip/2779/… 或许这篇文章可以帮到你:***.com/questions/27907438/… 也许您正在寻找EXCEPT 子句?在这里阅读:blog.sqlauthority.com/2008/08/07/… 您可以通过 VS(任何版本)数据比较轻松地做到这一点。您可以选择要匹配的 tbales 和列,前提是两个表都有一个唯一索引(或 PK)来匹配 【参考方案1】:

我认为你最好的选择是 SUBSTRACT()。 select x, y, z from A substract select x,y,z from B. 如果什么都不返回,你就可以走了。

希望这会有所帮助!

【讨论】:

...但是您需要在两个方向上都这样做:A=B 当且仅当 A-B 和 B-A 为空时。如果 A 是 B 的子集,A-B 将为空,但 B-A 不会。【参考方案2】:

我使用的一个快速技巧就是比较行数。这至少会告诉你是否有问题(它不会告诉你问题出在哪里)。

联合查询可以将两个查询连接在一起并显示组合结果。公共行被视为 1 行。因此,如果第一个查询正好返回 100 万行,则 UNION 查询(​​两个查询组合)应该正好返回 100 万行。如果没有问题。

select ColumnA 'Col1'
     , ColumnC 'Col2'
  from Table1
UNION
select ColumnF 'Col1'
     , ColumnI 'Col2'
  from TableB

【讨论】:

【参考方案3】:

类似

select 
    *
from
    gold_copy a
    join my_copy b on a.primary_key = b.primary_key
and
    a.field1 <> b.field1
    or a.field_a <> b.field_f
    or a.field_c <> b.field_i
    or a.field_x <> b.field_y

【讨论】:

【参考方案4】:

我认为以下内容将帮助您获得不匹配的记录。

select * from table1 where not exists (select * from table2);

因此,您可以从两个表中检查所需的列,而不是所有列,但我认为列名应该相同。

谢谢。

【讨论】:

【参考方案5】:

您可以为此使用对称差异

(select 'table1', col
from table1
UNION ALL
select 'table2', col
from table2)
EXCEPT
(select 'table1', col
from table1
INTERSECT
select 'table2', col
from table2)

这个查询只返回那些只在一个表中的行,并说明它是在哪个表中找到的

【讨论】:

以上是关于如何验证两个查询是不是包含完全相同的数据的主要内容,如果未能解决你的问题,请参考以下文章

查找两个不同列表是不是包含完全相同元素的简单方法?

如何同时查询SQLServer数据库中两个结构完全相同的数据表中的同一字段的值?

Oracle查询计算与日期数组完全相同的匹配

如何把两个完全相同的mysql数据库合并到另一个数据库中

如何在同时运行时阻止两个Node进程插入完全相同的数据库记录?

Oracle笔记 集合序列