Выберите все строки, которые соответствуют какой-либо из другой таблицы

#sql #sql-server

#sql #sql-сервер

Вопрос:

Получите все Users из первой таблицы, у которых есть какое-либо совпадение слов в другой таблице;

У меня есть Users таблица, которая содержит, среди прочего, столбец с FullName , этот столбец Full Text Search проиндексирован. Иногда первым «словом» является имя, иногда первым «словом» является фамилия из FullName столбца;

Например, John Smith или Smith John.

И другая таблица, у которой есть только локальное имя.

Я хочу получить всех пользователей, у которых есть соответствующее локальное имя.

 Users Table:
John Smith
Rebecca Mark
Maria Anna
Lance Maria 
Emilia Clark
Snow John
Natalie Butler

Name Table:
Maria
Smith

Result of Query:
John Smith
Maria Anna
Lance Maria
Snow John
  

Я могу использовать только одно имя с функцией Contains.

 SELECT * FROM Users WHERE CONTAINS(FullName, 'John');
  

Но мне это нужно для каждой строки в Name Table .

Каждая строка из FullName содержит любую из имен Table… Но в SQL-запросе.

Комментарии:

1. Вы можете выполнить внутреннее объединение, используя оператор like для имени

Ответ №1:

Чтобы избежать случая, когда вы выполняете поиск 'Maria' и совпадающее имя является 'Marianne' ,
проверьте выполнение 2 условий: (1) имя находится в начале или (2) в конце FullName :

(1):

 SELECT u.* 
FROM Users u INNER JOIN Name n
ON 
  u.FullName LIKE concat(n.name, ' %') 
  OR 
  u.FullName LIKE concat('% ', n.name)
  

или (2):

 SELECT u.* 
FROM Users u INNER JOIN Name n
ON 
  concat(' ', u.FullName, ' ') LIKE concat('% ', n.name, ' %') 
  

Ответ №2:

используйте join и like для сопоставления

 select u.* from table_users u join table_name b on
             u.users like concat('%',b.name,'%')
  

Ответ №3:

Вы можете использовать exists для этого:

 select u.*
from users u
where exists (select 1
              from nametable n
              where u.fullname like '%'   n.name   '%'
             );
  

Если вы хотите избежать частичных совпадений по именам, то примите во внимание разделители:

 where exists (select 1
              from nametable n
              where ' '   u.fullname   ' ' like '% '   n.name   ' %'
             );
  

Комментарии:

1. Проблема в том, что John совпадает с Johnson

2. Я могу взломать это с помощью одного оператора or с пробелами в начале ИЛИ в конце word. Вот так: ‘%’ n.name Или n.name ‘ %’.

3. Спасибо. Это работает хорошо, я должен принять первый рабочий ответ. Вверх. Вы получите upvote. 😉