我似乎正在重复执行此任务,因此我需要一个更好的解决方案。
我从两个不同系统中的两个不同数据库中提取数据(不要问为什么,它就是这样)。当我这样做时,最好我希望两个数据集具有相同的大小。我在两者上都有一个主键,让我们称之为“ ID”。我想做的是检查table1和table2中的此ID并获取唯一值(因此我可以继续查看为什么我在一个表中有更多内容)。我的数据集变得非常大(大约超过10万行),这使得我在excel中的VLOOKUP函数工作非常缓慢。有什么办法可以通过 speed 在excel中解决此问题?使用VBA宏,数据透视表或Excel内置SQL的解决方案会很好。使用excel 2016。
样品表:
ID_TableA ID_TableB
123456789208435989 123456789208435989
123456789239344137 123456789368934745
123456789368934745 123456789381895013
123456789381895013 123456789447760867
123456789447760867 123456789466692531
123456789466692531 123456789470807304
123456789470807304 123456789504343451
123456789504343451 123456789571573964
123456789563853210 123456789666106771
123456789571573964 123456789683792216
123456789666106771 123456789719645070
123456789683792216 123456789747751420
123456789719645070 123456789770236822
123456789747751420 123456789839975896
123456789770236822 123456789920037815
123456789825288494 123456789930612286
123456789839975896 123456789936072949
123456789920037815 123456789948401617
123456789930612286 123456789982601470
123456789936072949
123456789948401617
123456789982601470
解决方案的结果应输出:
123456789825288494
123456789563853210
123456789239344137
表中的数据为18个字符长的数字序列,其中前9个数字未更改。
编辑:两个表都可以包含唯一值。结果应返回两个表中唯一的值。
答案 0 :(得分:3)
假设您在单个数据库的单独表中同时拥有这两个列,那么使用SQL可以轻松解决此问题。这是一种方法:
SELECT a.ID_TableA
FROM TableA a
LEFT JOIN TableB b
ON a.ID_TableA = b.ID_TableB
WHERE b.ID_TableB IS NULL
UNION
SELECT b.ID_TableB
FROM TableA a
RIGHT JOIN TableB b
ON a.ID_TableA = b.ID_TableB
WHERE a.ID_TableB IS NULL;
另一种方式,使用EXISTS
:
SELECT ID_TableA
FROM TableA a
WHERE NOT EXISTS (SELECT 1 FROM TableB b WHERE a.ID_TableA = b.ID_TableB)
UNION
SELECT ID_TableB
FROM TableA b
WHERE NOT EXISTS (SELECT 1 FROM TableA a WHERE a.ID_TableA = b.ID_TableB);
答案 1 :(得分:2)
您可以使用powerquery(Get & Transform Data
):
let
SourceA = Excel.CurrentWorkbook(){[Name="tblA"]}[Content],
SourceB = Excel.CurrentWorkbook(){[Name="tblB"]}[Content],
UniqueA = Table.Join(SourceA,{"ID_TableA"},SourceB,{"ID_TableB"},JoinKind.LeftAnti),
UniqueB = Table.Join(SourceA,{"ID_TableA"},SourceB,{"ID_TableB"},JoinKind.RightAnti),
OutputList = List.Combine({UniqueA[ID_TableA], UniqueB[ID_TableB]})
in
OutputList
(编辑后已看到您需要从EITHER表中返回唯一值)
使用相似格式的一些模拟数据进行测试,这看起来非常快:
Input from tblA Rows: 250,000 Input from tblB Rows: 250,000 Start: 25/10/2018 14:17:13 End: 25/10/2018 14:17:15 Returned 41,042 unique values in about 2 seconds
答案 2 :(得分:2)
虽然我会像其他人建议的那样使用Access查询来做到这一点,但是这是我的2美分。
VLOOKUP
运行缓慢,而不是正确的功能。
Countif
更好一些,但是ISNUMBER(MATCH())
似乎是迄今为止最快的组合。
看看https://stackoverflow.com/a/29983885/78522