Ну, вы можете использовать LIKE
в стандартном JOIN
, но запрос, скорее всего, будет медленным, потому что он будет искать каждое собственное имя в каждом free_text
.
Например, если в списке 10 собственных имен и определенное значение free_text
содержит имя, сервер продолжит обработку остальных 9 имен.
Вот запрос:
SELECT -- DISTINCT
free_text_table.*
FROM
free_text_table
INNER JOIN proper_names_table ON free_text_table.free_text LIKE proper_names_table.proper_name
;
Если определенное значение free_text
содержит несколько собственных имен, эта строка будет возвращаться несколько раз, поэтому вам может понадобиться добавить DISTINCT
к запросу. Это зависит от того, что вам нужно.
Можно использовать LATERAL JOIN
, чтобы избежать декартова произведения (где каждая строка в free_text_table
сравнивается с каждой строкой в proper_names_table
). Конечный результат может быть быстрее, чем простой вариант. Это зависит от вашего распределения данных.
Вот синтаксис SQL Server.
SELECT
free_text_table.*
FROM
free_text_table
CROSS APPLY
(
SELECT TOP(1)
proper_names_table.proper_name
FROM proper_names_table
WHERE free_text_table.free_text LIKE proper_names_table.proper_name
-- ORDER BY proper_names_table.frequency
) AS A
;
Здесь нам не нужно DISTINCT
, будет не более одной строки в результате для каждой строки из free_text_table
(один или ноль). Оптимизатор должен быть достаточно умен, чтобы прекратить чтение и обработку proper_names_table
, как только будет найдено первое совпадение из-за предложения TOP(1)
.
Если вы также можете каким-то образом упорядочить свои собственные имена и поставить те, которые, скорее всего, будут найдены первыми, тогда запрос, скорее всего, будет быстрее, чем простой JOIN
. (Добавьте подходящее предложение ORDER BY
в подзапрос).