我有一个电子邮件地址表(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。)
您可以使用左外部联接或not exists子句。
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一种更有表现力。
notin
如评论者所述,您还可以尝试在上创建索引BLACKLIST(EmailAddress),这将有助于加快查询的执行速度。
BLACKLIST(EmailAddress)