选择与其他表中的任何行匹配的所有行

时间:2019-03-22 18:30:48

标签: sql sql-server

从第一个表中获取所有Users,并且在另一个表中有匹配的单词;

我有Users表,其中包含FullName列,该列已被索引Full Text Search。有时第一个“单词”是名称,有时第一个“单词”是FullName列中的姓;

像约翰·史密斯或史密斯·约翰一样。

还有另一个只有本地名字的表。

我想获取所有具有匹配本地名称的用户。

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中的每一行都包含任何名称表...但是在SQL查询中。

3 个答案:

答案 0 :(得分:1)

使用连接和喜欢进行匹配

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

答案 1 :(得分:1)

您可以使用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 + ' %'
             );

答案 2 :(得分: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, ' %')