有2个表emailinfo(id,email)和keywordinfo(id,keyword)。 emailinfo包含80,000行,keywordinfo包含2000行。
我想要来自emailinfo表的电子邮件,其中不包含来自keywordinfo table的关键字。
我想不喜欢多行的条件
我已将所有关键字保存在keywordinfo表
中现在我必须从emailinfo表中获取所有不包含keywordinfo表中任何关键字的电子邮件。
我想要查询如下,
select email
from emailinfo
where email not like % (select keyword from keywordinfo)
我尝试过以下查询
SELECT email
FROM emailinfo
join keywordinfo on email like '%' + keyword +'%'**
但它没有给我正确的结果而且非常慢。
答案 0 :(得分:2)
您的第二个查询略有变化怎么样?
SELECT Email
FROM EmailInfo
LEFT JOIN KeywordInfo ON Email LIKE '%' + Keyword + '%'
WHERE KeywordInfo.ID IS NULL
示例数据:
CREATE TABLE #EmailInfo (ID INT, Email VARCHAR(50))
INSERT INTO #EmailInfo (ID, Email) VALUES (1, 'test@example.com')
INSERT INTO #EmailInfo (ID, Email) VALUES (2, 'someone@sample.com')
INSERT INTO #EmailInfo (ID, Email) VALUES (3, 'testing@sample.com')
INSERT INTO #EmailInfo (ID, Email) VALUES (4, 'blahblah@blah.com')
INSERT INTO #EmailInfo (ID, Email) VALUES (5, 'example@email.com')
INSERT INTO #EmailInfo (ID, Email) VALUES (6, 'another@goodemail.com')
CREATE TABLE #KeywordInfo (ID INT, Keyword VARCHAR(50))
INSERT INTO #KeywordInfo (ID, Keyword) VALUES (1, 'sample')
INSERT INTO #KeywordInfo (ID, Keyword) VALUES (2, 'test')
SELECT Email
FROM #EmailInfo EmailInfo
LEFT JOIN #KeywordInfo KeywordInfo ON Email LIKE '%' + Keyword + '%'
WHERE KeywordInfo.ID IS NULL
DROP TABLE #EmailInfo
DROP TABLE #KeywordInfo
答案 1 :(得分:1)
以下查询将返回emailinfo表中没有在keywordinfo表中定义的任何关键字的所有记录。
建议在emailinfo.email字段上加上索引,以便更快地执行查询。
SELECT * FROM emailinfo
where not exists (Select 1 from
keywordinfo where emailinfo.email like '%' + keywordinfo.keyword +'%')
答案 2 :(得分:0)
替代配方消除了类似的情况:
Select
From emailinfo ie
Where not exists (select *
From ki
Where charindex(ki.keyword, ie.email) > 0)
我为格式化道歉,我在移动设备上。
我还建议您更改表结构,以便每个关键字都在一个单独的行中。那你就不需要那个操作符了。
答案 3 :(得分:-1)
您是否考虑过使用完整文本索引而不是尝试使用LIKE创建场景?
Pinal Dave有一个相当不错的介绍,可以帮助你入门:http://blog.sqlauthority.com/2008/09/05/sql-server-creating-full-text-catalog-and-index/