用于比较数据集的SQL

时间:2018-08-13 21:13:34

标签: sql

我经常需要比较两个数据集,以查看哪些行不同。 在Excel中,数据集很小,将我要比较的字段连接起来很容易,然后countif()使得新字段逐行匹配我的其他数据集的值。但是,当数据集太大时,当然会导致Excel崩溃。我一直认为这样做是一种hack方式,而且我想知道一种更合适的SQL方式。

因此,这是一个更直观的示例: 原始数据集

Abc, 123, 1/1/1900
A23, 4.5, 2/1/1900

新比较数据集

Abc, 123, 1/1/1900
A23, 4.6, 2/1/1900

Excel中的原始数据集

Abc, 123, 1/1/1900, =concatenate(A1,B1,C1), =countif('New'!D:D,C1)
A23, 4.5, 2/1/1900, =concatenate(A2,B2,C2), =countif('New'!D:D,C2)

Excel中的新比较数据集

Abc, 123, 1/1/1900, =concatenate(A1,B1,C1), =countif('Original'!D:D,C1)
A23, 4.6, 2/1/1900, =concatenate(A2,B2,C2), =countif('Original'!D:D,C2)

如果我按两张纸的最后一列进行过滤,则会得到两行不同,并且可以看到其中一行为4.5,另一行为4.6。

我不仅希望能够看到两组不匹配的记录,而且还需要能够仅基于某些匹配的字段/列而不是整个行进行比较。

我感觉答案类似于使用=sumproduct(--(field=value),--(field<value),range),这是我比较小型Excel数据集中事物的另一种方式。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

如果您使用的是SQL Server,最简单的方法是使用EXCEPT keyword

SELECT * FROM table1
EXCEPT
SELECT * from table2

该命令的名称非常好-它从第一个结果中选择所有内容,除了第二个结果中存在的那些行,即它“过滤”第二个结果中完全匹配的所有内容。

如果只想对某些列执行“匹配”,则可以只选择EXCEPT查询中的那些列,然后再联接回原始源以获取其余的列。