哪里不在/哪里不喜欢子查询

时间:2014-02-06 14:54:31

标签: sql-server tsql sql-server-2012

请有人帮我解决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

3 个答案:

答案 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

SQL Fiddle Demo

如果您想避开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 + '%'
)
相关问题