一尘不染

如何更快地执行SQ​​L“ NOT IN”查询?

sql

我有一个电子邮件地址表(EMAIL):

EmailAddress
------------
jack@aol.com
jill@aol.com
tom@aol.com
bill@aol.lcom

以及列入黑名单的电子邮件地址的表格(BLACKLIST):

EmailAddress
------------
jack@aol.com
jill@aol.com

我想选择EMAIL表中的那些电子邮件地址,而不是BLACKLIST表中的那些电子邮件地址。我正在做:

SELECT EmailAddress
FROM EMAIL
WHERE EmailAddress NOT IN
   (
      SELECT EmailAddress
      FROM BLACKLIST
   )

但是当行数很高时,性能会很糟糕。

我怎样才能更好地做到这一点? (如果可能,请假定使用通用SQL。否则,请使用T-SQL。)


阅读 181

收藏
2021-03-17

共1个答案

一尘不染

您可以使用左外部联接或not exists子句。

左外连接:

select E.EmailAddress
  from EMAIL E left outer join BLACKLIST B on (E.EmailAddress = B.EmailAddress)
 where B.EmailAddress is null;

不存在:

select E.EmailAddress
  from EMAIL E where not exists
         (select EmailAddress from BLACKLIST B where B.EmailAddress = E.EmailAddress)

两者 都是相当通用的SQL解决方案(不依赖于特定的数据库引擎)。我要说的是后者的性能要高一些(虽然不是很多)。但是绝对比那notin一种更有表现力。

如评论者所述,您还可以尝试在上创建索引BLACKLIST(EmailAddress),这将有助于加快查询的执行速度。

2021-03-17