我经常需要比较两个数据集,以查看哪些行不同。 在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数据集中事物的另一种方式。
感谢您的帮助。
答案 0 :(得分:1)
如果您使用的是SQL Server,最简单的方法是使用EXCEPT
keyword。
SELECT * FROM table1
EXCEPT
SELECT * from table2
该命令的名称非常好-它从第一个结果中选择所有内容,除了第二个结果中存在的那些行,即它“过滤”第二个结果中完全匹配的所有内容。
如果只想对某些列执行“匹配”,则可以只选择EXCEPT
查询中的那些列,然后再联接回原始源以获取其余的列。