在两个不同的表上匹配名字和姓氏

时间:2014-09-26 15:39:03

标签: sql sql-server regex

我正在尝试将表A中的第一个名称varchar(50)和姓氏varchar(50)与表B上的第一个名称varchar(50)和姓氏varchar(50)相匹配。问题是这两个表包含很多缩写的名字,比如表A中的安德鲁名字,可能会有一个与姓氏匹配的记录,但第一个名字是安迪,所以它出现的不是匹配。无论如何在SQL中解决这个问题。缩短的名称是一个反之亦然的问题,意味着表A和表B都有一些缩写的名称。

以下是一些例子:

enter image description here

这是我目前的代码。

Select *
FROM TableA p
JOIN TableB e ON e.CompanyNumber = 1 and e.LastName like '%' + rtrim(ltrim(p.lastname)) + '%' 
     and e.FirstName like '%' + ltrim(rtrim(p.firstname)) + '%' 

注意:这是将表格匹配的唯一方法。

3 个答案:

答案 0 :(得分:2)

创建一个关联Long-form和short-form名称的第三个表。

例如:

Long Form    Short Form
Andrew       Andy
Andrew       Drew
David        Dave
William      Will
William      Bill
William      Billy
William      Willy

答案 1 :(得分:1)

如果你使用第三张表来保存长/短名称。

CREATE TABLE TableNames
    ([Id] int, [OfficialName] varchar(7), [Alias] varchar(7))
;

INSERT INTO TableNames
    ([Id], [OfficialName], [Alias])
VALUES
    (1, 'Andrew', 'Andy'),
    (2, 'Andrew', 'Andrew'),
    (3, 'William', 'Bill'),
    (4, 'William', 'William'),
    (5, 'David', 'Dave'),
    (6, 'David', 'David')

以下查询应该可以为您提供所需内容。

SELECT *
FROM (
    SELECT TableA.Id AS T1_Id
        ,CompanyId AS T1_CompanyId
        ,FirstName AS T1_FirstName
        ,LastName AS T1_LastName
        ,TableNames.OfficialName AS OfficialName
    FROM tableA
    INNER JOIN tableNames ON TableA.FirstName = TableNames.Alias
    ) T1
    ,(
        SELECT tableB.Id AS T2_Id
            ,CompanyId AS T2_CompanyId
            ,FirstName AS T2_FirstName
            ,LastName AS T2_LastName
            ,TableNames.OfficialName AS OfficialName
        FROM tableB
        INNER JOIN tableNames ON TableB.FirstName = TableNames.Alias
        ) T2
WHERE T1.T1_CompanyId = T2.T2_CompanyId
    AND T1.OfficialName = T2.OfficialName
    AND T1.T1_LastName = T2.T2_LastName

我在http://sqlfiddle.com/#!3/64514/2

设置了解决方案sqlfiddle

我希望这会有所帮助。

答案 2 :(得分:0)

Select *
<br>FROM TableA pJOIN TableB e 
<br>ON e.CompanyNumber = 1 
<br>and e.LastName like '%' + rtrim(ltrim(p.lastname)) + '%' 
     <br>OR 
<br>e.FirstName like '%' + ltrim(rtrim(p.firstname)) + '%' 

现在这取决于你如何确定它是匹配的, 例如:

TableA:
--------
Rownum  FristName    LastName
1        Andy        Smith
2        Andy        Mathew

TableB:
--------
Rownum  FristName    LastName
1        Logan       Andy
2        Mathew      Andy


现在你会考虑两张桌子的第一张记录作为匹配
两张桌子的第二张记录怎么样?

基于此,我们甚至可以更改查询