Используйте предложение LIKE в части INNER JOIN

Может/Должен ли я использовать критерии LIKE как часть INNER JOIN при создании хранимой процедуры/запроса? Я не уверен, что задаю правильные вещи, поэтому позвольте мне объяснить.

Я создаю процедуру, которая собирает список ключевых слов, которые нужно искать в столбце, который содержит текст. Если бы я сидел на консоли, я бы выполнил его как таковой:

SELECT Id, Name, Description
  FROM dbo.Card
 WHERE Description LIKE '%warrior%' 
       OR
       Description LIKE '%fiend%' 
       OR 
       Description LIKE '%damage%'

Но трюк, который я немного подобрал, чтобы выполнить "строго типизированный" синтаксический анализ списка в хранимой процедуре, состоит в том, чтобы разобрать список в табличную переменную/временную таблицу, преобразовать ее в соответствующий тип и затем выполнить INNER JOIN против этой таблицы в моем окончательном наборе результатов. Это отлично работает при отправке в список списка целых идентификаторов. Я завершаю окончательный запрос, который выглядит следующим образом:

SELECT Id, Name, Description
  FROM dbo.Card
       INNER JOIN @tblExclusiveCard ON dbo.Card.Id = @tblExclusiveCard.CardId

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

SELECT Id, Name, Description
  FROM dbo.Card
       INNER JOIN @tblKeyword ON dbo.Card.Description LIKE '%' + @tblKeyword.Value + '%'

Возможно ли это/рекомендовано?

Есть ли лучший способ сделать что-то вроде этого?


Причина, по которой я устанавливаю подстановочные знаки на обоих концах предложения, заключается в том, что термины "арфид", "зверь-воин", "прямой ущерб" и "битва-ущерб" используются в текстах карт.

У меня создается впечатление, что в зависимости от производительности я могу либо использовать указанный мной запрос, либо использовать полнотекстовый поиск по ключевым словам для выполнения той же задачи?

Кроме того, что сервер делает текстовый индекс в полях, которые я хочу использовать для текстового поиска, есть ли что-то еще, что мне нужно сделать?

Ответ 1

Ваш первый запрос будет работать, но потребует полного сканирования таблицы, потому что любой индекс в этом столбце будет проигнорирован. Вам также придется сделать некоторый динамический SQL, чтобы сгенерировать все ваши предложения LIKE.

Попробуйте выполнить полнотекстовый поиск, если вы используете SQL Server или посмотрите одну из Lucene. Недавно Джоэл рассказал о своем успехе.

Ответ 2

Попробуйте это

    select * from Table_1 a
    left join Table_2 b on b.type LIKE '%' + a.type + '%'

Эта практика не идеальна. Следует использовать с осторожностью.

Ответ 3

Кажется, что вы ищете полнотекстовый поиск. Потому что вы хотите запросить набор ключевых слов по описанию карты и найти какие-либо образы? Правильно?

Ответ 4

Лично я делал это раньше, и это хорошо сработало для меня. Единственные проблемы, которые я мог увидеть, - это, возможно, проблемы с неиндексированным столбцом, но я думаю, что у вас будет такая же проблема с предложением where.

Мой совет вам просто взгляните на планы исполнения между ними. Я уверен, что это будет отличаться от того, какой из них лучше в зависимости от ситуации, как и все хорошие проблемы программирования.

Ответ 5

@Dillie-O
Насколько велика эта таблица?
Каков тип данных поля Описание?

Если они малы, полный текстовый поиск будет излишним.

@Dillie-O
Может быть, не ответ, который вы ищете, но я бы защищал изменение схемы...

предлагаемая схема:

create table name(
    nameID identity / int
   ,name varchar(50))

create table description(
    descID identity / int
   ,desc varchar(50)) --something reasonable and to make the most of it alwase lower case your values

create table nameDescJunc(
    nameID  int
    ,descID int)

Это позволит вам использовать индекс без необходимости использования решения на болтах и ​​сохранить ваши данные атомарными.

related: Рекомендуемый дизайн базы данных SQL для тегов или тегов

Ответ 6

трюк, который я немного подобрал выполнять "строго типизированный" разбор списков в хранимая процедура заключается в анализе список в переменную таблицы/временную Таблица

Я думаю, что вы, возможно, намекаете на то, чтобы включить ключевые слова в таблицу, а затем реляционное подразделение, чтобы найти совпадения ( также может использовать другую таблицу для исключения слов). Для обработанного примера в SQL см. Поиски ключевых слов Джо Селько.

Ответ 7

Производительность будет зависеть от фактического сервера, чем вы используете, а также от схемы данных и объема данных. С текущими версиями MS SQL Server этот запрос должен выполняться просто отлично (у MS SQL Server 7.0 были проблемы с этим синтаксисом, но он был адресован в SP2).

Запустили ли вы этот код через профилировщик? Если производительность достаточно высокая и данные имеют соответствующие индексы на месте, вы должны быть установлены.

Ответ 8

LIKE '% fiend%' никогда не будет использовать поиск, LIKE 'fiend%' будет. Просто поиск подстановочных знаков не поддается определению

Ответ 9

Попробуйте это;

SELECT Id, Name, Description
FROM dbo.Card
INNER JOIN @tblKeyword ON dbo.Card.Description LIKE '%' + 
                                CONCAT(CONCAT('%',@tblKeyword.Value),'%') + '%'

Ответ 10

попробуйте...

select * from table11 a inner join  table2 b on b.id like (select '%'+a.id+'%') where a.city='abc'.

Его работы для меня.: -)