Как выбрать строки в 1 таблице, содержащие ключевые слова из другой таблицы в SQL?

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

Например:

Фразы

  • мне нравится моя собака

  • Моя любимая еда макароны

  • Программирование — это весело

Ключевые слова

  • любимая еда

  • собака

Моя цель - вернуть первые 2 строки.

Пока у меня есть:

select a.*

from sentences a

join keywords b

on a.sentences like '%' || b.keywords || '%'

Однако я получаю сообщение об ошибке «выполнение этого запроса включает выполнение одного или нескольких декартовых объединений продуктов, которые не могут быть оптимизированы».

Любые идеи? Заранее спасибо. Также не уверен, что это имеет большое значение, но я делаю это на SAS 9.4.


person sqlnewbie33    schedule 28.11.2015    source источник
comment
Ошибка говорит вам, как получить решение   -  person Keith Beard    schedule 29.11.2015
comment
comment
Это ошибка или примечание? Поскольку вам нужно сравнивать каждую запись с любой другой записью в таблице, это декартово соединение.   -  person Reeza    schedule 29.11.2015
comment
Возможный дубликат Эффективное объединение/слияние на основе совпадающей части строка   -  person Bacon Bits    schedule 29.11.2015


Ответы (1)


Есть несколько проблем, от которых следует защититься в коде такого типа, но основные проблемы: начальные и конечные пробелы в ключевых словах поиска, совпадение регистра символов (большинство сравнений символов SAS чувствительны к регистру), повторяющиеся совпадения (несколько ключевых слов, совпадающих с одним предложением).

Приведенный ниже шаблон кода должен решать эти проблемы.

select distinct a.*
from sentences a cross join keywords b
where findw(a.sentences,b.keywords,' ','ir');

Аргумент «различный» удалит повторяющиеся совпадения, в то время как функция findw указывает использовать пробелы ' ' в качестве единственного интересующего разделителя, а «ir» указывает на нечувствительность к регистру (модификатор 'i') и удаляет начальные и конечные разделители/пробелы ( модификатор 'r' в сочетании с обозначением '' в качестве разделителя).

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

person shawn    schedule 29.11.2015