2014-02-06 3 views
2

Может кто-нибудь помочь мне с запросом 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 многословны, а некоторые содержат бренд внутри них.

Большое спасибо

Edit: Может быть, я могу повторно уточнить, что я ищу своего этого псевдо SQL:

выберите имя из Keyword.dbo.NGrams где Описание не содержащий (выберите Слово из Keyword.dbo.Brands)

Бренд - это список слов. Описание в NGrams будет фразой 2 или 3 слова. Я хочу, чтобы выбрать все NGrams, которые не содержат какой-либо из Brands

+0

Можете ли вы показать, как выглядит ваши данные, было бы легко выяснить. – Maverick

+0

Brand.Name будет чем-то вроде «Nike». И NGram.Name будет чем-то вроде «Green Nike Shoes». – Trevor

+0

Попробуйте получить все совпадающее имя в одной временной таблице и сравнить один и тот же запрос с временной таблицей. он должен работать нормально. – Maverick

ответ

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+' %' 
+0

Незначительная проблема заключается в том, что объединение может потенциально дублировать имена из Keyword.dbo.NGrams n, где LIKE удовлетворяет нескольким именам. –

+0

@KRichard в примере SQL Fiddle есть NGrams, которые соответствуют нескольким Brands. Выход не имеет дубликатов. У вас есть образцы данных, которые создают дубликаты? – Anon

+0

@ Не знаю. Да, вы правы. Я был сосредоточен на объединении, которое, я думаю, могло бы вернуть dups, но любые совпадающие дубликаты будут устранены WHERE b.Name IS NULL –

0

Я проверил тест, используя стандартный английский список слов ENABLE2K. Я создал 10 миллионов случайных 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 
) 
+0

Хммм, это выглядит интересно, потому что у меня уже нормализованы NGrams. Позвольте мне отдать это! – Trevor

+0

Не повезло с этим. Я получаю такое же количество результатов с и без того, где не существует. Я действительно не понимаю sql достаточно хорошо, чтобы понять, почему – Trevor

+0

Опубликуйте свою фактическую схему и индексы. – Anon

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 + '%' 
) 
+0

Этот запрос также уменьшает мои возвращенные результаты от 280 000 до 544, что также неверно. Но он работал намного быстрее, чем первое решение. 37 минут против 4 часов – Trevor

+0

@Trevor Если два разных решения вашего вопроса производят точное количество результатов, и вы отклоняете оба варианта, возможно, вы задаете неправильный вопрос. – Anon

Смежные вопросы