Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Выбрать из 1 таблицы строки, не содержащие вхождений из 2 таблицы  [new]
Mokronozhka
Member

Откуда:
Сообщений: 11
Добрый день.
Не могу никак придумать как ускорить ил правильно спроектировать запрос.

Есть таблица 1, она содержит 1 колонку nvarchar(max).
Есть таблица 2, она содержит 1 колонку nvarchar(50).

В таблице 1 содержатся фразы, а в таблице 2 исключаемые слова (типа мину слов).

Задача: выбрать из таблицы 1 все фразы, которые не содержат в себе ни одного исключаемого (минус) слова из таблицы 2.

Пример.

Таблица 1
песня про елка шарики хлопушки слушать
новый год елка шарики хлопушки минусовка

Таблица 2
хлебном
кормушка
корневая

В 1 таблице около 100000 строк, во второй 5000, получается при объединениях запрос работает ооочень медленно.
Если просто прописываю условия charindex для 1 таблицы на все слова из 2 таблицы, то получается тоже медленно.

Подскажите или наведите на мысли :), пожалуйста, как правильно сделать выборку.
Спасибо большое.
10 фев 16, 12:47    [18798533]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из 1 таблицы строки, не содержащие вхождений из 2 таблицы  [new]
Mokronozhka
Member

Откуда:
Сообщений: 11
таблица 1
выбрать печь для бани на дровах для отопления
выбрать печь для отопления дома
выбрать печь для парилки
выбрать печь для сауны

Таблица 2
бани
отопления

На выходе должны выбираться только строки
выбрать печь для парилки
выбрать печь для сауны

Т.к. в них нет исключаемых слов из таблицы 2

Т.е. если в фразе из таблице 1 есть хотя бы 1 слово из таблицы 2, то эту фразу мы должны проигнорировать
10 фев 16, 12:51    [18798559]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из 1 таблицы строки, не содержащие вхождений из 2 таблицы  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
Mokronozhka,

очередной сферический конь в вакууме,
что значит медленно?
сколько должно быть?
какая структура таблиц?
какой запрос тестируете?
10 фев 16, 12:51    [18798560]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из 1 таблицы строки, не содержащие вхождений из 2 таблицы  [new]
iap
Member

Откуда: Москва
Сообщений: 47065
SELECT *
FROM T1
WHERE NOT EXISTS
(
 SELECT *
 FROM T2
 WHERE T1.F NOT LIKE N'%'+T2.F+N'%'
);

Это всё медленно, ибо в любом случае надо сканировать таблицы целиком,
так как использовать индексы невозможно.

Однако, есть же полнотекстовый поиск!
10 фев 16, 12:55    [18798588]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из 1 таблицы строки, не содержащие вхождений из 2 таблицы  [new]
Mokronozhka
Member

Откуда:
Сообщений: 11
WarAnt,

Входные данные:

Таблица_1
request nvarchar(max)
100 000 строк

Таблица_2
word nvarchar(50)
5 000 строк

1. Первый запрос был вообще без второй таблицы, все условия были в where. Время выполнения: не дождался, т.е. > 2 минут:

select
request
from
Таблица_1
where
patindex('% микроволновая %', ' ' + request + ' ') = 0 and patindex('% свч %', ' ' + request + ' ') = 0
.....

2. Потом я залил все слова в таблицу 2 и сделал запрос с объединением, все вообще стало еще хуже. Время выполнения: не дождался, т.е. > 2 минут:

select
request
from
Таблица_1
CROSS JOIN Таблица_2
where
on charindex([Таблица_2.word, ' ' +Таблица_1.request + ' ') = 0

Я с СКЛ недавно начал работать, поэтому не всегда представляю как можно соединить таблицы для оптимального быстродействия
10 фев 16, 13:16    [18798712]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из 1 таблицы строки, не содержащие вхождений из 2 таблицы  [new]
Speshuric
Member

Откуда: г. Москва
Сообщений: 129
Mokronozhka,

Первую таблицу привести в нормальную форму (хотя бы первую) - т.е. сделать дочернюю таблицу, где nvarchar(max) уже разложен по словам. Дальше тупой джойн по равенству или экзист или как-то так.
10 фев 16, 13:36    [18798803]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из 1 таблицы строки, не содержащие вхождений из 2 таблицы  [new]
Mokronozhka
Member

Откуда:
Сообщений: 11
Speshuric,
Дело в том, что в таблице 2 значением колонки может быть не только 1 слово (слово1), но и 2 (слово1 слово2).
И если я раздроблю первую таблицу на слова, то я не смогу проверить на вхождение сразу по 2-ум словам из строки таблицы 2.
10 фев 16, 13:41    [18798846]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из 1 таблицы строки, не содержащие вхождений из 2 таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104751
Mokronozhka
И если я раздроблю первую таблицу на слова, то я не смогу проверить на вхождение сразу по 2-ум словам из строки таблицы 2.

Не могу и не умею - это разные вещи

Зачем придумывать то, что уже реализовано в полнотекстовом поиске ?
10 фев 16, 13:44    [18798875]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить