从一个表与另一个表中查找匹配的人(MS SQL Server)

撒迪厄斯

我有两张桌子:

表“人”

ID          FirstName  LastName
----------- ---------- ----------
1           Janez      Novak
2           Matija     Špacapan
3           Francka    Joras

表“用户列表”

ID    FullName
----- --------------------
1     Andrej Novak
2     Novak Peter Janez
3     Jana Novak
4     Andrej Kosir
5     Jan Balon
6     Francka Joras
7     France Joras

因此,查询必须从两个表中返回这些 ID,即表 Person 中的 FirstName 和 Lastname 存在于表 UserList 中。姓名和姓氏必须完全相同。表 UserList 中的 FullName 可以包含中间名 - 应该“忽略”。

比赛:Janez Novak = Janez Novak OR Novak Janez OR Janez Peter Novak

不匹配:Janez Novak <> Janeza Novak 或 Jjanez Novak

想要的结果:

ID   FirstName  LastName  ID   WholeName
---- ---------- --------- ---- -------------------
1    Janez      Novak     2    Novak Peter Janez
3    Francka    Joras     6    Francka Joras

这是我的查询:

SELECT 
    A.ID
    ,A.FirstName
    ,A.LastName
    ,B.ID
    ,B.WholeName
FROM    
    dbo.UserList B
    cross join dbo.Person A 
WHERE   
    (                                                
    CHARINDEX('"'+A.FirstName+'"', '"'+Replace(B.WholeName,' ','"')+'"') > 0
     AND CHARINDEX('"'+A.LastName+'"', '"'+Replace(B.WholeName,' ','"')+'"') > 0 
    )

当表中的记录不多时,查询工作正常。

但是我的表有:“Person”-> 400k 和“UserList”-> 14k 记录。

我找到解决方案的方法可以吗,还是有其他更有效的方法可以做到这一点?谢谢你。

BR

故事

创建表

create table persons (
  id int IDENTITY(1,1) PRIMARY KEY,
  FirstName nvarchar(32) NOT NULL,
  LastName nvarchar(32) NOT NULL
);

create table users (
  id int IDENTITY(1,1) PRIMARY KEY,
  FullName nvarchar(32) NOT NULL
);

样本数据

INSERT INTO persons (FirstName, LastName)
values
('Janez','Novak'),
('Matija','Špacapan'),
('Francka','Joras');

INSERT INTO users (FullName)
VALUES
('Andrej Novak'),
('Novak Peter Janez'),
('Jana Novak'),
('Andrej Kosir'),
('Jan Balon'),
('Francka Joras'),
('France Joras'),

/* --EDIT: added sample data for wildcard testing-- */
('Franckas Joras'), -- added 's' after firstname
('Francka AJoras'), -- added 'A' before lastname
('Franckas AJoras'), -- both above
('Francka Jr. Joras'), -- added just midname
('Franckas Jr. Joras'); -- added 's' before firstname & added midname as well

查询(匹配名称)

SELECT p.id, p.FirstName, p.LastName, u.id as user_id, u.FullName
FROM persons p, users u
WHERE
  -- EDIT
  /* changed wildcards (added spaces on both sides)
  + added 2 more conditions without wildcards */
  u.FullName LIKE CONCAT(p.FirstName, ' % ', p.LastName)
  OR
  u.FullName LIKE CONCAT(p.LastName, ' % ', p.FirstName)
  OR
  u.FullName LIKE CONCAT(p.FirstName, ' ', p.LastName)
  OR
  u.FullName LIKE CONCAT(p.LastName, ' ', p.FirstName)

输出

SO-72348127

编辑:输出新样本数据(用于通配符测试)SO-72348127 (2)

运行示例SQL Fiddle

上面的示例链接是 MySQL 的,代码在 SQL 服务器上运行良好

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将表从一个数据库复制到SQL Server中的另一个数据库

从一个表到另一个表的SQL Server数据库批量插入

在主表中查找与SQL Server中另一个表中的记录匹配的记录

SQL Server 2008 R2:更新与另一个表匹配的表值

SQL Server 2008 R2中不同服务器中从一个表到另一个表的BCP

如何从一个表中选择与SQL Server中的另一个表完全匹配的所有记录?

SQL Server将最近的记录与另一个表匹配

SQL Server:从一个表,另一个表或两者中获取唯一的ID

从另一个表SQL Server更新值

使用来自另一个表的信息更新SQL Server中的表

SQL Server:从一个表复制到accountID匹配的另一个表

SQL Server:将丢失的数据从一个表插入/更新到另一个表

在SQL Server 2008中通过检查将varbinary从一个表移动到另一个表

从一个表中选择数据,然后基于SQL Server中的另一个表重命名列

将记录从一个表插入到另一个表,而不违反SQL Server数据库中的任何约束

如何在SQL Server中将一个表中的特定行加到另一个表

SQL Server-如果另一个表的任何匹配行中的列为true,则将一个表中的列设置为true

MS SQL Server,基于另一个表创建和更新表

将ID从一个表传递到另一个表,并在SQL Server中获得总联合结果

SQL Server:插入到表中,从另一个表中选择

SQL Server 2008查询将表数据从一个移动到另一个

将一个表中的行集合连接到另一个表的列 - SQL Server

联接中另一个表中的引用表名列 - SQL Server

SQL Server:基于搜索另一个结果集从一个表中获取结果

将一个表中的值插入到 SQL Server 中的另一个表中

SQL Server 根据另一个表中的条件查找值的总和

SQL Server - 从一个表插入到另一个值不为空的表

MS SQL Server - 如果匹配另一个视图中列中的多个条件,则更新表行

SQL Server:查询以从同一个表和另一个表中获取数据