请有人帮我解决MS-SQL查询问题。
我有以下内容:
select Name from Keyword.dbo.NGrams
where Name not in (select Name from Keyword.dbo.Brands)
我真正想要的是这样的,但我无法正确理解
select Name from Keyword.dbo.NGrams
where Name not like (select Name from Keyword.dbo.Brands)
“不在”非常适合NGrams&完全匹配的品牌。但是我的NGrams有多个单词,有些单词中包含一个Brand。
非常感谢
编辑:也许我可以重新澄清我正在寻找的这个伪sql:
从Keyword.dbo.NGrams中选择名称 其中描述不包含(从Keyword.dbo.Brands中选择Word)
品牌是单个单词的列表。 NGrams中的描述将是一个2或3个单词的短语。我想选择所有不包含任何品牌的NGrams
答案 0 :(得分:0)
SELECT
n.Name
FROM Keyword.dbo.NGrams n
LEFT JOIN Keyword.dbo.Brands b
ON n.Name LIKE '%'+b.Name+'%'
WHERE b.Name IS NULL
如果您想避开Scunthorpe Problem并且只匹配整个字词,请将连接条件更改为:
ON ' '+n.Name+' ' LIKE '% '+b.Name+' %'
答案 1 :(得分:0)
我使用ENABLE2K标准英语单词列表进行了测试。我生成了1000万随机ngrams和50000个随机品牌。查询大约需要1分钟才能在我的工作站上运行。
CREATE TABLE #enable2k (word varchar(max) NOT NULL)
BULK INSERT #enable2k FROM 'C:\enable2k.txt'
CREATE TABLE #ngrams (ngram_id int NOT NULL, word_num int NOT NULL, word varchar(max) NOT NULL, PRIMARY KEY(ngram_id, word_num));
INSERT #ngrams SELECT TOP 10000000 ROW_NUMBER() OVER(ORDER BY NEWID()), 1, word FROM #enable2k,(SELECT TOP 58 0 FROM master..spt_values) t(i)
INSERT #ngrams SELECT TOP 10000000 ROW_NUMBER() OVER(ORDER BY NEWID()), 2, word FROM #enable2k,(SELECT TOP 58 0 FROM master..spt_values) t(i)
INSERT #ngrams SELECT TOP 10000000 ROW_NUMBER() OVER(ORDER BY NEWID()), 3, word FROM #enable2k,(SELECT TOP 58 0 FROM master..spt_values) t(i)
CREATE TABLE #brands (brand varchar(32) NOT NULL PRIMARY KEY)
INSERT #brands SELECT TOP 50000 word FROM #enable2k WHERE LEN(word) <= 32 ORDER BY NEWID()
SELECT *
FROM #ngrams n
PIVOT (MIN(word) FOR word_num IN ([1],[2],[3])) n1
WHERE NOT EXISTS (
SELECT 1
FROM #ngrams n2
INNER JOIN #brands b
ON (n2.word = b.brand)
WHERE n1.ngram_id = n2.ngram_id
)
答案 2 :(得分:0)
使用where not exists
表示类似内容:
select Name
from Keyword.dbo.NGrams ng
where not exists (
select *
from Keyword.dbo.Brands b
where ng.Name like '%' + b.name + '%'
)