SQL检查一个表中的行是否也存在于另一个表中的最有效方法

时间:2017-04-11 19:00:30

标签: mysql sql sql-server

我有两个DB表,每个表都包含电子邮件地址

long

我现在想检查两个表中有多少相同的电子邮件地址。 即两个表格中都有相同的地址。

哪种方法最快: 1.将两个数据集下载为csv,将其加载到内存中并在程序代码中进行比较 2.使用数据库查询获取重叠的结果集。

如果2更好:建议的SQL查询是什么?

3 个答案:

答案 0 :(得分:1)

我会选择DBQuery。在两个DB之间建立链接服务器连接(可能在MSSQL端),并使用简单的内部联接查询来生成两个表中出现的电子邮件列表:

select a.emailAddress
from MSDBServ.DB.dbo.Table1 a
join MySqlServ.DB..Table2 b
    on a.EmailAddress = b.EmailAddress

找到集合差异,这将需要更多的处理器能力(并且它将产生至少1.4b的结果导致每个匹配MSSQL行的MySql行的最佳情况),但查询实际上不是很不一样。你仍然想要一个连接,但现在你希望该连接返回两个表中的所有记录,无论它们是否可以连接,然后你特别想要未连接的结果(在这种情况下,一边的字段将为null) :

select a.EmailAddress, b.EmailAddress
from MSDBServ.DB.dbo.Table1 a
full join MySqlServ.DB..Table2 b
    on a.EmailAddress = b.EmailAddress
where a.EmailAddress IS NULL OR b.EmailAddress IS NULL

答案 1 :(得分:0)

Table1拥有70,000,000个电子邮件地址,table2拥有1,500,000,000个电子邮件地址。我使用Oracle,因此Upper函数在MySQL中可能有也可能没有。

Select EmailAddress from table1 where Upper(emailaddress) in (select Upper(emailaddress) from table2)

比比较电子表格更快,这假设两个表都在同一个数据库中。

答案 2 :(得分:0)

您可以执行SQL查询来检查两个数据库中存在多少个相同的电子邮件地址:第一个数字是重复数量,第二个值是电子邮件地址。

SELECT COUNT(emailAddr),emailAddr FROM table1 A
INNER JOIN
table2 B
ON A.emailAddr = B.emailAddr