Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Задачка на SQL  [new]
Ант
Guest
Наверняка существует нормальный способ решения следующей задачки средствами только SQL, без процедурной обработки. Я нашел пока только не очень красивый способ.

Задача:
Есть исходная таблица с текстовым полем (например, SourceText).
И есть справочник, содержащий некие ключевые подстроки.

Требуется связать исходную таблицу со справочником на предмет входимости этих ключевых подстрок в строку SourceText. Причем, если в конкретной строке SourceText содержится более одной ключевой подстроки, то связывание должно происходить только по первой подходящей подстроке. Т.е. запрос (left join) должен вернуть такое же количество строк, сколько их содержится в исходной таблице.

Т.е. суть задачки — классический "Select", но его варианты для гибкости помещены в справочник, и, соответственно, хочется реализовать это одним SQL-запросом.
22 авг 05, 13:06    [1806628]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на SQL  [new]
Drema
Member

Откуда: Москва
Сообщений: 249
SELECT	T1.*,
	(SELECT	MIN(T2.SubStr)
	FROM	T2
	WHERE	T1.SourceText like '%'+T2.SubStr+'%'
	) as T2_SubStr
FROM	T1

____________________
http://potolook.positic.ru - Шаблоны, подсветка и дополнительные возможности в Outlook®
22 авг 05, 14:21    [1806983]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на SQL  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Я бы не решал эту задачу влоб. По регламенту (или по событию) скан изменившихся строк таблицы (timestamp?), создание кросс - линк таблицы, связывающей справочник и нашу таблицу. В случае необходимости - прямое обращение к кросс-линк таблице. Ну или просто попользовать MS Search. Он то же самое делает, но сам.
22 авг 05, 15:14    [1807247]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на SQL  [new]
Ант
Guest
Спасибо.
Да, я также реализовал через Min (с небольшими отличиями).
Это единственный вариант? Я почему-то посчитал, что он не самый верный...
22 авг 05, 15:15    [1807250]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на SQL  [new]
Ант
Guest
2Crimean:
Спасибо за идеи.
22 авг 05, 15:20    [1807269]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на SQL  [new]
Drema
Member

Откуда: Москва
Сообщений: 249
Crimean
Я бы не решал эту задачу влоб. По регламенту (или по событию) скан изменившихся строк таблицы (timestamp?)..


Это, наверно, смотря какая нагрузка на эту логику будет.

Ант
Спасибо.
Да, я также реализовал через Min (с небольшими отличиями).
Это единственный вариант? Я почему-то посчитал, что он не самый верный...


Можно и TOP 1 вместо MAX использовать :)
22 авг 05, 15:24    [1807282]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на SQL  [new]
Ант
Guest
Drema
Можно и TOP 1 вместо MAX использовать :)
А вот с TOP у меня как раз не получилось... я полагал, что вариант с TOP может быть более эффективен.
Можно ли привести пример с TOP 1, где правильно осуществляется связывание?
22 авг 05, 16:05    [1807469]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на SQL  [new]
Drema
Member

Откуда: Москва
Сообщений: 249
SELECT	T1.*,
	(SELECT	TOP 1 T2.SubStr
	FROM	T2
	WHERE	T1.SourceText like '%'+T2.SubStr+'%'
	) as T2_SubStr
FROM	T1

____________________
http://potolook.positic.ru - Шаблоны, подсветка и дополнительные возможности в Outlook®
22 авг 05, 16:41    [1807659]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на SQL  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
declare @SourceText table([text] varchar(100))
declare @TextParts table([part] varchar(50))
insert into @SourceText values('Мой папа самых честных правил')
insert into @SourceText values('Когда не в шутку занемог')
insert into @SourceText values('Своей кобыле ТАК заправил')
insert into @SourceText values('Что дворник вытащить не смог')
insert into @TextParts values('папа')
insert into @TextParts values('когда')
insert into @TextParts values('мог')
select * from @SourceText
select * from @TextParts

select st.[Text],tp.[part]
from @SourceText st
left outer join @TextParts tp on (Charindex(tp.[part],st.[text])>0)
where not exists(select 1 from @TextParts where Charindex([part],st.[text])>0 and Charindex([part],st.[text])< Charindex(tp.[part],st.[text]))
23 авг 05, 09:05    [1808785]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить